javaWeb-Servlet的继承体系和HttpServletRequest中常用的方法+HttpServletResponse对中文乱码的处理

《一:Servlet的继承体系》

javaWeb-Servlet的继承体系和HttpServletRequest中常用的方法+HttpServletResponse对中文乱码的处理_第1张图片

1.GenericServlet

1.Generic实现servlet接口和serveltConfig接口。

2.GenericServlet可以处理TCP/IP协议的一切请求,而我们常用浏览器发出请求只是用Http,在GenericServlet的基础上提供一个类HttpServlet:
  HttpServlet处理Http相关请求,HttpServlet中的service方法如下(只是将servlet请求强转成HttpServlet,请求再调用GenericServlet中的service方法,因为非Http类型参数的service才是sevlet的生命周期方法):
@Override
    public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException {

        HttpServletRequest  request;
        HttpServletResponse response;

        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response);
    }
}

2.HttpServlet处理请求:

1.定义servlet直接继承HttpServlet

2.处理请求的两种方法:

    2.1:在自定义的servlet中覆写service方法,该方法可处理一切HpptServlet请求(post,get):

    2.2:在子类中同时覆写:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException{

 }
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            doGet();
  }
2.3:但是不管是doGet还是doPost中,都不能存在super.doPost(req,resp),super.doGet(req,resp),因为doGet和doPost在父类中只会抛错.

3.在HttpServelt中如何自定义初始化方法:

1.调用带参数的初始化方法:
//HttpServlet中:
public void init(ServletConfig config){
       //由类具有多态性,只会执行子类中的init方法,但少了此句,
       //就不能初始化父类中的ServletConfig成员对象,后续就无法取到配置信息
       super.init(config);
       //自定义初始化代码
}
//在GenericServlet中:
public void init(ServletConfig config){
    this.config = config;
    this.init();
}
2.调用无参初始化方法:

(因为init(ServletConfig config)带参数的才是servlet生命周期方法,初始时执行它,然后利用多态回调子类中自定义的init的无参方法):

//1.HttpServlet中
public void init(){
   //自定义初始化代码
}

//2.GenericServlet中:
public void init(ServletConfig config){
     this.config = config;
     //由于子类中没有含参init,故只会执行父类中的此方法而多态调用子类中的init()方法
     this.init();
}

public void init(){
       //NOOP by default
}


《二:HttpServletRequest中常用的方法》

String getMethod():                             返回请求方式,如:GET/POST
String getRequestURI():                         返回请求行中资源名字路径,如:/test/index.html
StringBuffer getRequestURL():                   返回浏览器地址栏中的数据,如:http://......
String getContextPath():                        返回web应用中server.xml中path属性的值
String getParameter(String paramName):          返回指定名字参数的值
String[] getParameterValues(String paramName):  返回指定名字参数多个参数值

Enumeration<String> getParameterNames():        返回所有参数名组成的的Enumeration对象
Map<String, String[]> getParameterMap():        返回所有参数和值组成的Map对象
String getRemoteAddr():                         返回发出请求的客户机的IP地址
String getHeader(String headName):              返回指定名称头字段的值

注意:
HttpServletRequest.getParameterNames和ServletConfig.getInitParameterNames的区别:

getParameterNames: 是获取请求参数的名字
getInitParameterNames:是获取当前servlet在web.xml中配置的初始化参数。

《三:HttpServletResponse对中文乱码的处理》

1.编码和解码方法处理中文乱码问题(将乱码恢复成二进制格式,用相对应的编码方式重新组装):




//1.获取参数值,中文有乱码
String username = req.getParameter("username");

//2.用ISO-8859-1方式解码成二进制(web中默认是用此方式编码的,当然用此方式解码)
byte[] data = username.getBytes("ISO-8859-1");

//3.用项目中的编码方式来编码
username = new String(data, "utf-8");
2.POST请求传来含乱码的值(表单):
在获取参数前设置:req.setCharacterEncoding("utf-8");
3.GET请求传来含乱码的值(地址栏,超链接,表单:常不会传中文):
  修改Tomcat根/config/server.xml中端口修改处加上:
  URLEncoding="utf-8" ,不加默认对get请求是ISO-8859-1;

4.应用:
        //4.1:输出html:
        resp.setContextType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();

        //4.2:获取含中问的参数值前:
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");

你可能感兴趣的:(JavaWeb基础)