文档章节

Servlet做Controller,实现一个类处理多个请求

Pickacat
 Pickacat
发布于 2016/10/15 23:03
字数 845
阅读 1718
收藏 2

        传统的Servlet都是一个请求对应一个Servlet。

        例子如下:

请求:http://localhost:8080/ServletTest/Login

web.xml配置:

	<servlet>
		<servlet-name>Regist</servlet-name>
		<servlet-class>cn.xiaol.web.servlet.before.RegistServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Regist</servlet-name>
		<url-pattern>/Regist</url-pattern>
	</servlet-mapping>

Servlet代码:

public class RegistServlet extends HttpServlet {
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 重定向到regist页面
		response.sendRedirect(request.getContextPath() + "/regist.jsp");
	}

	// 在url上面测试是用Get方法请求,所以需要重写doGet()让它调用doPost()。
	// 也可以把doPost()中的代码直接写在doGet()
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
}

        所以当web项目很大时,请求也就很多,web.xml的配置量也就跟着变大,各种Servlet类爆增。

        于是我们可以通过反射的方式,将一类方法放在一个Servlet类中。例如User的增删改查请求可以放在一个UserServlet里面处理。

        下面做一个例子,将login和regist请求放在一个TestServlet中处理。但是在此之前需要先写一个父类BaseServlet,里面有一个利用反射原理实现的通过方法名调用对应方法的方法。挺绕口的。意思是这个BaseServlet继承HttpServlet,然后重写service()方法,因为每一个请求Servlet都会调用一次service方法,而这个service方法通过反射和请求中带的method参数可以调用自己类中对应的方法。

        一个完整的流程就是:

        第一步:请求http://localhost:8080/ServletTest/TestServlet?method=login

        第二步:子类TestServlet继承了BaseServlet,所以也继承了父类的service方法。一次请求触发一次service方法,于是service方法通过反射调用了TestServlet中的login方法。

        第三步:login方法处理完返回处理结果。

 

下面是例子:

请求:http://localhost:8080/ServletTest/TestServlet?method=login

1、http://localhost:8080/ServletTest/TestServlet是我们要请求的Servlet

2、method=login是我们要请求的Servlet中的方法

web.xml配置:

	<servlet>
		<servlet-name>TestServlet</servlet-name>
		<servlet-class>cn.xiaol.web.servlet.after.TestServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>TestServlet</servlet-name>
		<url-pattern>/TestServlet</url-pattern>
	</servlet-mapping>

BaseServlet代码:

package cn.xiaol.web.servlet.after;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BaseServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1、获得方法名称
		String methodName = request.getParameter("method");
		Method method = null;

		// 2、通过方法名和方法所需要的参数获得Method对象
		try {
			method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
		} catch (Exception e) {
			throw new RuntimeException("调用的方法:" + methodName + "不存在", e);
		}

		// 3、通过Method对象调用方法
		try {
			String result = (String) method.invoke(this, request, response);
			if (result != null && result.trim().length() > 0) {// 如果返回的result不为空
				int index = result.indexOf(":");// 获得第一个冒号的位置
				if (index == -1) {// 如果没有冒号,就使用转发
					request.getRequestDispatcher(result).forward(request, response);
				} else {// 如果有冒号
					String start = result.substring(0, index);// 截取前缀
					String path = result.substring(index + 1);// 截取路径
					if (start.equalsIgnoreCase("f")) {// 前缀为f表示使用转发
						request.getRequestDispatcher(path).forward(request, response);
					} else if (start.equalsIgnoreCase("r")) {// 前缀为r表示使用重定向
						response.sendRedirect(request.getContextPath() + path);
					}
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

TestServlet代码:

package cn.xiaol.web.servlet.after;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @date 创建时间:2016年10月15日 上午11:59:25
 */
public class TestServlet extends BaseServlet {

	public String login(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("login");
		return "/login.jsp";
	}

	public String regist(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("regist");
		return "/regist.jsp";
	}
}

        当我们需要增加一个有关Test的请求时,我们可以直接在TestServlet中添加相关方法,而不比再写一个Servlet类。但是请求的时候记得要带上method方法参数。

        下面是Demo的完整代码

http://pan.baidu.com/s/1nvuEhBz

© 著作权归作者所有

Pickacat
粉丝 2
博文 16
码字总数 13601
作品 0
深圳
程序员
私信 提问
Spring MVC入门

核心类与接口: 先来了解一下,几个重要的接口与类。现在不知道他们是干什么的没关系,先混个脸熟,为以后认识他们打个基础。 DispatcherServlet -- 前置控制器 HandlerMapping接口 -- 处理请...

为梦而来
2014/01/25
3.7K
0
深入理解Spring MVC 思想

一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 父子上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、s...

qq58edf1d989a2d
2018/06/26
0
0
JavaWeb中的监听器、过滤器、拦截器、适配器简述

概念 ------------ context-param: 就是一些需要初始化的配置,放入context-param中,从而被监听器(这里特指org.springframework.web.context.ContextLoaderListener)监听,然后加载; 监...

丌官尚雄
02/27
36
0
Java学习资料-Servlet单例多线程

Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并...

晓阳
2015/02/26
136
0
springMVC --(讲解1)介绍

springMVC处理请求流程 1.客户端发起一个http请求 2.该请求被springMVC的DispacherServlet(控制器)进行拦截匹配,匹配到了委托给HandleRequest(处理器) 3.处理器会调用HandlerMapping与Handl...

求是科技
2016/10/06
43
0

没有更多内容

加载失败,请刷新页面

加载更多

UAVStack功能上新:新增JVM监控分析工具

UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。 引言 作为...

宜信技术学院
3分钟前
1
0
MySQL的5种时间类型的比较

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00 TIMESTAMP 4 bytes YYYY-MM......

物种起源-达尔文
10分钟前
3
0
云服务OpenAPI的7大挑战,架构师如何应对?

阿里妹导读:API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参...

阿里云官方博客
13分钟前
1
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
18分钟前
1
0
6、根据坐标,判断该坐标是否在地图区域范围内

最近在写配送区域相关的代码,具体需求如下: 根据腾讯地图划分配送区域,总站下边设多个配送分站,然后将订单中的收货地址将其分配给不同的配送分站。 1、地图区域划分(腾讯地图) 1.1、H...

有一个小阿飞
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部