之前在练习的时候因为请求少一直没注意过这个问题,就直接一个请求新建一个Servlet,但是如果请求多了以后就会发现,需要不停的创建新的servelet以及不停的在web.xml中配置servelt,会导致项目看起来十分的杂乱,严重降低效率。于是就需要去思考,如何将一系列的请求用一个servelt封装起来。
实现多个请求公用一个servelt有两种方法
方法一 在每一个请求后面跟上?method= '方法名',再在servelt更具method的值进行处理,method的值可以通过request.getParameter('method')获取
优点--便于理解,实现简单
缺点--麻烦,不利于维护,每加一个方法就要加一层选择结构
首先是web.xml中对这个servlet类进行配置
<servlet>
<servlet-name>mrequest</servlet-name>
<servlet-class>Controller.MRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mrequest</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
然后是jsp中的代码
<body>
<h3>
<a href="hello?method=add"> 增加</a>
</h3>
<h3>
<a href="hello?method=delete"> 删除</a>
</h3>
<h3>
<a href="hello?method=modify"> 更改</a>
</h3>
</body>
最后是servlet中的代码
public class MRServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//request.getRequestDispatcher("success.jsp").forward(request,response);
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");//设置页面编码
String method = request.getParameter("method");//获取method中的值
if("add".equals(method)){//通过选择结构根据method的去判断调用类中的哪个方法
add(request,response);
}else if("delete".equals(method)){
delete(request, response);
}else if("modify".equals(method)){
modify(request,response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
private void add(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();
out.println("<h1>增加</h1>");
}
private void delete(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();
out.println("<h1>删除</h1>");
}
private void modify(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();
out.println("<h1>修改</h1>");
}
}
方法二 利用java的反射机制,当然上一种方法种截取出方法名后也可以直接利用反射,本质上讲,这两种方法,只要截取出方法名后,你是利用选择结构还是反射,是可以随便选的。
优点--便于维护
缺点--较难理解
现在web.xml中对servlet进行配置
<servlet>
<servlet-name>invokeServlet</servlet-name>
<servlet-class>Controller.InvokeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>invokeServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
然后是jsp中的代码
<body>
<h3>
<a href="add.do"> 增加</a>
</h3>
<h3>
<a href="delete.do"> 删除</a>
</h3>
<h3>
<a href="modify.do"> 更改</a>
</h3>
</body>
最后是servelt中的代码
public class InvokeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");//设置页面编码
String URL = String.valueOf(request.getRequestURL());
String method = URL.substring(URL.lastIndexOf("/")+1,URL.lastIndexOf("."));
//获取URL的值并通过截取函数截出method的值,通过反射,会更具method的值匹配方法
try{
Class c = this.getClass();//获取本类对象
//获取method对象
Method m = c.getDeclaredMethod(method,HttpServletRequest.class,HttpServletResponse.class);
m.invoke(this,request,response);//激活方法
}catch (Exception e){
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
private void add(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();
out.println("<h1>增加</h1>");
}
private void delete(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();
out.println("<h1>删除</h1>");
}
private void modify(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();
out.println("<h1>修改</h1>");
}
}
界面样式
方法一结果
方法二结果