javaWeb 复习系列(四)---- 多个请求映射到同一个 Servlet

来源:互联网 发布:淘宝买二手东西在哪 编辑:程序博客网 时间:2024/06/05 21:01

我们在开发 javaweb 程序的时候,都需要处理请求与 Servlet 的映射关系。传统的方法是一个请求对应一个 Servlet,这样做的明显缺点就是在 web.xml 文件中映射的 Servlet 的映射数量太多了,而且不利于功能的封装。比如一个 Servlet 中应该对应一套增删改查的操作,如果将这些功能都分离开来从而写成 AddServlet、DeleteServlet、UpdateServlet、QueryServlet 无疑是对功能封装的极大破坏,而且不利于代码的维护。那么如何将一系列请求映射到同一个 Servlet 中从而减少需要映射的 Servlet 的个数呢?这里提供两种常见的方法。

一种办法是给每个请求后面加上请求参数,然后根据请求参数决定调用同一个 Servlet 中的哪个方法来处理。jsp 页面上代码如下:

<span style="white-space:pre"></span><a href="TestServlet?method=add">Add</a><br><br><a href="TestServlet?method=delete">Delete</a><br><br><a href="TestServlet?method=update">Update</a><br><br><a href="TestServlet?method=query">Query</a><br><br>
代表要请求的url。Servlet 的处理代码如下:
@Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 获取请求参数String menthod = request.getParameter("method");//根据不同参数调用不同的处理方法switch (menthod) {case "add":add(request, response);break;case "delete":delete(request, response);break;case "update":update(request, response);break;case "query":query(request, response);break;default:break;}}
在 Servlet 中获取请求参数,调用对应的处理方法,从而达到不同请求对应同一个 Servlet 的目的。处理方法代码如下:
<span style="white-space:pre"></span>private void query(HttpServletRequest request, HttpServletResponse response) {System.out.println("query...");}private void update(HttpServletRequest request, HttpServletResponse response) {System.out.println("update...");}private void delete(HttpServletRequest request, HttpServletResponse response) {System.out.println("delete...");}private void add(HttpServletRequest request, HttpServletResponse response) {System.out.println("add...");}
这是第一种方法,这种方法的缺点是每当有个新的请求,就需要在代码中添加一个 switch 的分支,并且添加对应的处理方法,而且在请求的 url 中暴露了要调用的方法,可能存在安全隐患。下面介绍第二种方法。

首先给每个请求的url加上统一的后缀,比如 .do 或 .action 等,然后在web.xml 文件中配置 url-patten 的值为 *.do 或 *.action ,在 Servlet 中首先利用 ServletPath 的值获取请求的方法,然后利用反射调用对应的方法来处理请求。jsp 页面代码如下:

<span style="white-space:pre"></span><a href="add.do">Add</a><br><br><a href="delete.do">Delete</a><br><br><a href="update.do">Update</a><br><br><a href="query.do">Query</a>
Servlet 处理请求的代码如下:
<span style="white-space:pre"></span>//得到的结果是 /add.do,/delete.do等形式String servletPath = request.getServletPath();String methodName = servletPath.substring(1);//得到真正的请求方法名 add,delete等形式methodName = methodName.substring(0, methodName.length()-3);//利用反射调用对应的处理方法try {Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);method.invoke(this, request,response);} catch (Exception e) {e.printStackTrace();}
反射调用的方法如下:
<span style="white-space:pre"></span>public void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{System.out.println("query...");}public void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{System.out.println("update...");}public void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{System.out.println("delete...");}public void add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{System.out.println("add...");}
对应的 Servlet 的配置文件如下:
<servlet>    <servlet-name>TestServlet</servlet-name>    <servlet-class>com.demo.TestServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>TestServlet</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>
这种方法的优点是不需要写大量的 switch 分支,要添加请求只需要添加对应的处理方法即可。

以上就是使用不同的方法使多个请求对应到同一个 Servlet 的用法。

0 0
原创粉丝点击