一个Servlet中可以有多个处理请求的方法

BaseServlet

  一个请求写一个Servlet太过复杂和麻烦,我们希望在一个Servlet中可以有多个处理请求的方法。

  客户端发送请求时,必须给出一个参数,用来说明要调用的方法

  方法的结构和service()方法的结构一样

初始版

  当我们访问Servlet时,发生了那些操作?

  首先是通过<url-pattern>找到<servlet-name>,通过<serlvet-name>最终找到<servlet-class>,也就是类名,在通过反射得到Serlvet对象。

  再由tomcat调用init()、service()、destroy()方法,这一过程是Servlet的生命周期。在HttpServlet里有个service()的重载方法。ServletRequest、ServletResponse经过service(ServletRequest req,ServletResponse resp)方法转换成Http格式的。再在service(HttpServletRequest req,HttpServletResponse resp)中调用doGet()或者doPost()方法。

  路径:http://localhost:8080/baseservlet/base?method=addUser

public class BaseServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String method = req.getParameter("method");//获取要调用的方法,其中的value="method"是自己约定的
		if("addUser".equals(method)){
			addUser(req,resp);
		}
		if("deleteUser".equals(method)){
			deleteUser();
		}
	}

	private void deleteUser() {
		System.out.println("deleteUser()");
	}

	private void addUser(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("add()");

	}

}

改进版

  很显然,这样的代码不是我们想要的。

public class BaseServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String name = req.getParameter("method");//获取方法名
		if(name == null || name.isEmpty()){
			throw new RuntimeException("没有传递method参数,请给出你想调用的方法");
		}
		Class c = this.getClass();//获得当前类的Class对象
		Method method = null;
		try {
			//获得Method对象
			method =  c.getMethod(name, HttpServletRequest.class,HttpServletResponse.class);
		} catch (Exception e) {
			throw new RuntimeException("没有找到"+name+"方法,请检查该方法是否存在");
		}

		try {
			method.invoke(this, req,resp);//反射调用方法
		} catch (Exception e) {
			System.out.println("你调用的方法"+name+",内部发生了异常");
			throw new RuntimeException(e);
		}

	}
}

在项目中,用一个Servlet继承该BaseServlet就可以实现多个请求处理。  

部分资料来源网络

时间: 2024-10-11 04:48:00

一个Servlet中可以有多个处理请求的方法的相关文章

如何实现一个Servlet中的多个功能

如何实现一个Servlet中的多个功能 前言:唉,打脸了,前脚刚说过要跟Servlet正式告别,后脚这不又来了,哈哈,总结出一点东西,纠结了一下还是做个分享吧,学习知识比面子重要,对吧,下回再也不约Servlet了. 需求分析 看下面代码,现在有一个UserServlet,里面有增删改查四个方法,按平常的思维,用一个Servlet实现一个功能,这没毛病,现在问题是一个Servlet中有四个功能,那这该如何去实现呢? package com.my.servlet; import com.my.se

CI框架中,判断post,ajax,get请求的方法

所有就得我们自己造轮子了.下面就介绍一下,如何定义这些判断请求的方法.其实很简单的. 首先打开constants.php,这是一个定义常量的文件.然后往文件里加上这几行代码. 1 2 3 4 //定义请求数据的方法 define('IS_POST',strtolower($_SERVER["REQUEST_METHOD"]) == 'post');//判断是否是post方法 define('IS_GET',strtolower($_SERVER["REQUEST_METHOD

Servlet 中为多项选择题判分---String类的indexOf()方法妙用

首先来看一下String类的indexOf()方法的用法: 1 public class FirstDemo1 { 2 /** 3 *API中String的常用方法 4 */ 5 // 查找指定字符串是否存在 6 public static void main(String[] args) { 7 String str1 = "abcdefghijklmnabc"; 8 // 从头开始查找是否存在指定的字符 9 System.out.println(str1.indexOf("

JS判断一个数组中是否有重复值的三种方法

方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace(ary[i]+",","").indexOf(ary[i]+",")>-1) { alert("数组中有重复元素:" + ary[i]); break; } } 方法二: var ary = new Array("

Servlet中的转发

Servlet中可以把当前的请求和响应转发到另一个Servlet中,并由另一个Servlet负责输出响应.转发时,源Servlet会把它的ServletRequest对象和ServletRespnse对象都传递给目标Servlet.转发需要调用javax.servlet.RequestDispatcher接口的forward方法.转发的路径在生成RequestDispatcher实例的时候传入.有两种方法可生成RequestDispatcher实例,分别: ServletContext的getR

servlet请求转发到另一个servlet

servlet请求转发到另一个servlet,并传递数据 . 1.通过request.setAttribute("key",value)给request加信息. 2.通过request.getRequestDispather(目标servlet).forward(request,response) 传递制定servlet. 3.在另一个servlet中通过request.getAttribute("key")来获取附加信息的值.

Servlet(五):一个Servlet处理多个请求

一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet方法,再将响应信息返回给浏览器,这种情况下,一个具体的Servlet类只能处理对应的web.xml中配置的url-pattern请求,一个Servlet类,一对配置信息.如果业务扩展,需要三个Servlet来处理请求,就需要再加上两个具体的Servlet类,两对配置信息,如果继续向上扩展,是不是会认

cchttpclient中停止网络请求的方法

cchttpclient是异步网络连接,在网速慢的时候,应用退出了该页面,未执行的网络请求还是按照队列请求下去,这导致重新进入页面时候,新的网络请求的得不到快速响应.而cchttpclient类中并没有提供移除请求的方法,查看源码,发现所有的请求都放在s_requestQueue数组中,那么要做的就是在退出界面时候,清空这个请求队列.如下是在httpclient.cpp中添加的禁止所有请求的方法: void CCHttpClient::stopAllResquest(){ CCHttpReque

在Servlet中出现一个输出中文乱码的问题(已经解)。

在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException { //PrintWriter out = response.getWriter();在还没有给response指定编码格式时就获取了他的输出流,所以一直乱码 reqeust.setCharact