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
}
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中配置的初始化参数。
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");