@为什么需要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>