servlet知识点总结

时间:2023-02-25 22:45:34

 

1.servlet编码解码

  1.1.servlet要输出中文给客户端
    response.setContentType("text/html;charset=utf-8");
  1.2.告诉服务器使用指定的编码格式进行解码
    request.setCharacterEncoding("utf-8");
  1.3.获取响应输出写出流
    PrintWriter out = response.getWriter();//输出文本
    OutputStream response.getOutputStream();//输出字节(非文本)
    例子:
    OutputStream  ops = response.getOutputStream();


2.获得表单中的请求参数值

 String request.getParameter(String paraName);
 String[] request.getParameterValues(String paraName);//多个参数名相同
 Map request.gerParameterMap();//获取键值对形式的多个请求参数
 例子:
 String name = request.getParameter("name");
 


3.重定向


 //生成重定向响应给浏览器
 response.sendRedirect(String url);
 例子:
 response.sendRedirect("list.do");

 

4.分析请求资源路径,然后分别处理

 

 String uri = request.getRequestURI();
 例子:
 String uri = request.getRequestURI();
 // 截取字符串,只取"/名字"
 String action = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));


 
5.servlet初始化参数的处理

 

 5.1.配置初始化参数
   <servlet></servlet>中
  <!-- 初始化参数 -->
  <init-param>
   <param-name>pricing</param-name>
   <param-value>bj,0.08;sh,0.09;jn,0.03</param-value>
  </init-param>
 5.2.使用初始化参数
  在init()中:
  ServletConfig config = getServletConfig();
  String pricing = config.getInitParameter("pricing");
 


6.告诉jdbc驱动,在输出时,使用utf-8这种编码格式进行编码

 

 dbc:mysql://localhost:3306/数据库名?
 useUnicode=true&characterEncoding=utf8


 
7.转发

 

 7.1.转发
  //先绑订数据
  request.setAttribute(String name,Object obj);
  //获得转发器//转发
  request.getRequestDispatcher(String url).forward(request,response);
  例子:
  request.setAttribute("employee", employee);
  request.getRequestDispatcher("emplist.jsp").forward(request, response);
  例子2;
  //(没有数据就不需要邦定数据)
  request.getRequestDispatcher("error.jsp").forward(request, response);
 7.2.接收转发
  Object request.getAttribute(String name);
  例子:
  Employee e =(Employee)request.getAttribute("employee");
 


8.获取appName(应用名)

 

 String request.getContextPath()
 


9.处理异常

 

 方式一:邦定,转发
 方式二:
  throw new ServletException(e);
  然后在web.xml中配置错误处理页面
   <error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/error.jsp</location>
   </error-page>
 


10.密码加密

 

 MessageDigest md=MessageDigest.getInstance("md5");//或者sha算法
 String s="字符串";
 //生成摘要//是一个字节数组
 byte[] buf =md.digest(s.getBytes());
 //BASE64Encoding可以将任意的一个字节数组转换一个字符串
 BASE64Encoder ec=new BASE64Encoder();
 String str=ec.encode(buf);
 


11.异常的处理

 

 步骤一.将异常抛出给容器
  throw new ServletException(e)
 步骤二.web.xml中配置错误处理页面
  让容器知道出现异常后,应该调用哪一个页面。
   <error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/error.jsp</location>
   </error-page>
   


12.cookie技术

 

 12.1.创建一个cookie
  Cookie c = new Cookie(String name,String value); 
  response.addCookie(c);//给浏览器添加cookie//通过响应头传递cookie
 12.2.cookie的查询
  Cookie[] request.getCookies();//获取请求信息中提交的cookie
  if(cookie!=null){
   String cookie.getName();
   String cookie.getValue();
  }
 12.3.cookie的生存时间
  cookie.setMaxAge(int seconds);
 12.4.删除cookie
  Cookie c = new Cookie("userId","");
  c.setMaxAge(0);
  response.addCookie(c);
 12.5.cookie的编码问题只识别ASCII编码
  // 编码
  URLEncoder.encode("中文","utf-8")
  // 解码
  URLDecoder.decode(str,"utf-8");
 12.6.设置cookie的路径
  cookie.setPath(String path);

 

13.session技术

 

 13.1.获得session对象
  HttpSession session = request.getSession();
 13.2.获得sessionId
  String sessionId=session.getId();
 13.3.邦定数据
  session.setAttribute(String name,Object obj);
 13.4.获取邦定数据
  Object session.getAttribute(String name);
 13.5.解除邦定
  session.removeAttribute(String name);
 13.6.设置session超时
  session.setMaxInactiveInterval(int seconds);
 13.7.删除session
  session.invalidate();
 


14.验证码


 
 14.1.jsp中的设置:
  方式一:
  <img src="checkcode" id="img1"
   onclick="document.getElementById('img1')." +
     "src='checkcode?' + Math.random();"/>
 
  <a href="javascript:;"
   onclick="document.getElementById('img1')." +
     "src='checkcode?' + Math.random();">看不清,换一个</a>
  方式二:
  验证码:
  <img id="num" src="checkCode" />
  <a href="javascript:;"onclick="document." +
  "getElementById('num').src = 'checkCode?'+(new Date()).getTime()">换一张</a>
  
  


 
15.url重写,用户禁止cookie,如何继续使用session
 


 15.1.用于链接地址,表单提交地址,url重写
  response.encodeURL(String url);
 15.2.用于重定向,url重写
  response.encodeRedirectURL(String url);
  例子:
  response.sendRedirect(response.encodeRedirectURL("list.jsp"));
 15.3.转发不需要
 


16.过滤器

 

 16.1.如何写一个过滤器
 
  step1,写一个java类,实现Filter接口。
  step2,将处理逻辑写在doFilter方法里面。
  step3,配置过滤器(web.xml)
  
 16.2.一般过滤器的request,response需要做强制转换。
 
  HttpServletRequest request =(HttpServletRequest)arg0;
    HttpServletResponse response =(HttpServletResponse)arg1;
    
 16.3.调用后续的过滤器或者servlet
 
    arg2.doFilter(arg0, arg1);
  说明:
   FilterChain:有一个方法doFilter(ServletRequest,ServletResponse),
   如果调用了该方法,表示要调用后续的过滤器或者servlet。
   如果没有调用该方法,则请求处理完毕,开始发送响应。
   
 16.4.配置过滤器(web.xml)
 
  web.xml中设置;
    <!-- 过滤器的配置:要放在servlet前面 -->
    <filter>
     <filter-name>过滤器名</filter-name>
     <filter-class>web.过滤器</filter-class>
     <!-- 初始化参数 -->
     <init-param>
      <param-name>参数名</param-name>
      <param-value>参数</param-value>
     </init-param>
    </filter>
   
   
    <filter-mapping>
     <filter-name>过滤器名</filter-name>
     <url-pattern>/过滤器之后要执行的servletURL</url-pattern>
    </filter-mapping>
    
 16.5.访问初始化参数
 
  第一步:
   private FilterConfig config;
  第二步:
   在init(FilterConfig arg0)中,将FilterConfig对象的引用保存下来
   config = arg0; 
  第三步:
   String FilterConfig.getInitParameter(String paraname);
     例子:String str=config.getInitParameter(String paraname);
  


17.上传文件

 

 jsp中的设置
 
  <form action="fileupload" method="post" enctype="multipart/form-data">
    name:<input name="name"/><br/>
    photo:<input type="file" name="file1"/>
    <br/>
    <input type="submit" value="提交"/>
  </form>

 

18.字符串编码解码

 

 18.1.编码
  String URLEncoder.encode("中文","utf-8")
 18.2.解码
  String URLDecoder.decode(str,"utf-8");

 

19.Servlet上下文


 容器在启动的时候,会为每一个应用创建唯一的一个符合
 ServletContext接口的实例
 
 19.1.如何获得ServletContext?
   
  a, GenericServlet.getServletContext();
  b, HttpSession.getServletContext();
  c, ServletConfig.getServletContext();
  d, FilterConfig.getServletContext();
  
  例子:
   ServletContext sctx = getServletContext();
 
 19.2.作用
 
  a, 依据逻辑路径获得实际部署时的物理路径
   String  getRealPath(String path);
  例子:
   String path = sctx.getRealPath("upload");
 
  b,绑订数据
   setAttribute,getAttribute,removeAttribute
   
   request,session,servlet上下文,都有这三个方法,
   在满足需要的情况下,应该优先使用生命周期短的。
   
  c, 访问全局的初始化参数
   String getInitParameter(String paramName);
  
 19.3.全局的初始化参数配置
    <!-- 全局的初始化参数 -->
    <context-param>
     <param-name>company</param-name>
     <param-value>tarena</param-value>
    </context-param>
  


20.监听器

 

 20.1.如何去写一个监听器?
   
  step1, 先写一个java类,实现相应的监听器接口。
  要依据监听的事件类型来选择相应的监听器接口(
  比如,要监听session的创建和销毁,要用
  HttpSessionListener接口)。
  
  step2,在接口所声明的方法里面,实现相应的处理逻辑。
  
  step3,注册监听器(web.xml)。
  
 20.2.注册监听器web.xml的配置
 
    <!-- 监听器的配置 -->
    <listener>
     <listener-class>web.监听器类名</listener-class>
    </listener>

 

21.web.xml的配置顺序

 <!-- 全局的初始化参数 -->
 <!-- 过滤器的配置 -->
 <!-- 监听器的配置 -->
 <!-- servlet的配置 -->
 <!-- 首页 -->

/////////

22.servlet的线程安全问题

 

 22.1.servlet在容器内部只有一个实例,容器会启动多个线程来调用这个servlet实例,
   就有可能发生线程安全问题:
   比如,多个线程同时去修改servlet实例的某个属性。
 
 22.2.如何解决?
   
  a,使用synchronized关键字加锁
   例子:
    synchronized(this){
     count ++;
    }

  b,让servlet实现SingleThreadModel接口(不建议使用)
    容器会为每一个线程创建一个对应的servlet实例来处理请求。
    因为会产生过多的servlet实例,所以,建议少用。

 

23.mvc

 

 23.1.可以用自定义异常来处理model模型中的检索的信息
     用自定义异常抛出信息 ,可以用异常编号进行异常区分
  --------------------------------
     if(a == null){
   //抛出一个自定义异常
   throw new AccountNotExistException();
   //用编号,在自定义异常类的构造器中实现初始化的参数
   //throw new AccountNotExistException(1001);
     }
  --------------------------------
     catch (Exception e) {
        e.printStackTrace();
        if(e instanceof AccountNotExistException){
        request.setAttribute("apply_error", "帐号不存在,请重新输入");
        request.getRequestDispatcher("apply.jsp")
        .forward(request, response);
       }
     }
     --------------------------------
 23.2.mvc
  m:model:业务逻辑是java类
  v:view:视图,例如jsp
  c:controller:控制器,servlet