《JavaWeb从入门到改行》关于BaseServlet那些事
@为什么需要BaseServlet? 我们知道一个POST或者GET提交对应着一个Servlet, 无数的提交会让Servlet页面增加,我们希望一个Servlet就能处理很多提交的请求。
@BaseServlet 是一个继承了HttpServlet的普通类,并不是Servlet类,所以不需要在web.xml中添加路径。但是Servlet会继承这个BaseServlet来实现一个Servlet处理多个提交请求 。
@一些要求 是: 客户端发送请求时,必须提供一个参数(本文编写的这个参数名字叫method,这个method和form中的那个method没有半毛钱关系,只是一个变量名字而已),用来说明要调用Servlet中的那个处理方法; 其次,继承了BaseServlet的Servlet中的处理请求的方法的原型必须与service方法相同,即返回值类型、参数都不需要和service方法相同。即如下的形式:
public String XXX(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { return null ; }
@POST和GET请求对于method参数的提供技巧 POST请求一般为表单形式,提供method参数的方式可以添加一个隐藏字段 <input type="hidden" name="method" value="希望调用Servlet中的方法的名字"/> ; @GET请求一般为超链接,提供method参数的方式直接在路径后面加 ?method=方法名
@POST和GET请求编码处理 我们知道Servlet对POST请求和对GET请求的请求编码不同,区别如下:
POST的请求 request.setCharacterEncoding("utf-8"); String name = request.getParameter("name"); GET的请求 String name = request.getParameter("name"); name = new String(name.getBytes("ISO-8859-1"),"utf-8"); POST和GET的响应编码都是: response.setContentType("text/html;charset=UTF-8");
为了使得servlet中的代码简洁,我们可以把两种编码的代码放到BaseServlet中,但是,像上传下载这种请求不适合用BaseServlet,所以我们一般把这种代码写在过滤器中,过滤器不是本文主要内容,如果你不会的话,可以不用过滤器,把编码的代码直接写在servlet中的请求处理方法中即可 。
@源码
1 <%--get请求,传递过去method参数,指明调用TestServlet的fun2方法,并且传递一个参数param--%> 2 <a href="<c:url value='/TestServlet?method=fun2¶m=哈哈'/>"> 点击这里啊</a> 3 <%--post请求--%> 4 <form action="<c:url value='/TestServlet'/>" method="post"> 5 <input type="hidden" name="method" value="fun1"/> 6 <input type="text" name="param" value="我是表单参数" /> 7 <input type="submit" name="提交"/> 8 </form>
1 package cn.demo1.baseServlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 /** 9 * TestServlet 10 * 实现了一个Servlet中多个请求处理方法 11 * 方法的的参数必须和service方法相同 12 * 客户端必须传递过来method参数,说明是调用哪一个请求处理方法 13 * @author ZHAOYUQIANG 14 * 15 */ 16 public class TestServlet extends BaseServlet { 17 /** 18 * 测试post传递过来的参数 19 * @param request 20 * @param response 21 * @return 22 * @throws ServletException 23 * @throws IOException 24 */ 25 public String fun1(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 String param = request.getParameter("param"); 28 request.setAttribute("param", param); 29 return "f:/baseServlet/index.jsp" ; 30 } 31 /** 32 * 测试get请求传递过来的参数 33 * @param req 34 * @param resp 35 * @return 36 * @throws ServletException 37 * @throws IOException 38 */ 39 public String fun2(HttpServletRequest request, HttpServletResponse response) 40 throws ServletException, IOException { 41 String param = request.getParameter("param"); 42 request.setAttribute("param", param); 43 return "f:/baseServlet/index.jsp"; 44 } 45 }