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

https://my.oschina.net/Shawn1in/blog/759004

        传统的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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
网上体育商城的设计与实现 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第1页。 目 录 Part2: 研究的目的及意义 Part4: 系统需求分析 Part5: 收获 Part3: 采用的技术 Part1: 开发背景 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第2页。 开发背景 LOREM IPSUM DOLOR 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第3页。 开发背景 伴随着互联网加时代的到来,智能手机的不断普及,过快的工作节奏,使人们在紧张繁忙的工作之后,没有大把的时间再去逛商场购买物品,因此很多人选择在网上商城购买自己心仪的物品。我们生活中常见的体育用品从外表观察,品种繁多,实体店无法有足够大的店面来展示所有物品,有些喜欢锻炼的朋友没有时间去实体店挑选,而且现在的网上购物环境越来越好,买到的东西如果不满意还可以免费退换,人们也乐于尝试在线购买,所以网上体育商城在互联网上纷纷出现。 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第4页。 研究的目的及意义 LOREM IPSUM DOLOR 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第5页。 研究的目的及意义 在各行各业竞争日益激烈的今天,工作的效率和质量,是每个企业都要面对并且重视的问题。如果网上体育商城的系统开发成功,有些着急需要使用产品而没有时间的客户,将不再需要去实体店寻找,现在Wifi的覆盖率也非常广,可以在任何地方,拿出自己的手机或电脑,登上体育商城的网站,挑选自己需要的商品,下单订购就好了,非常的方便,顾客使用这样的系统,既可以节约时间,又能挑选自己喜欢的商品,非常省事,而商家使用这样的系统,可以提高办事效率,把以前对销售员的开销能省下来。 随着这种购物网站的不断出现,计算机和网络技术的不断进步和提升,个人电脑和智能手机的增加,使人的信息传播方式和生活方式都得到了很大的改变,人们的网购也会越来越频繁,这无形中也促进了互联网在中国的发展,对提高我国的经济发展水平也是有利的,所以我认为开发这个网上体育商城,对人们的生活有诸多的好处,值得开发。 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第6页。 采用的技术 LOREM IPSUM DOLOR 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第7页。 采用的技术 Struts框架诞生于2001年,Struts 2是Struts的下一代产品,Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。对于用户的请求是通过拦截器来处理的,当用户在客户端对浏览器发出请求,根据struts.xml中的配置找到对应的Action和方法,返回结果result,并跳转到相应页面,返回HTTP响应到客户端浏览器,简单的说,就是用户在页面发出一个请求,通过struts找到对应的方法进行处理处理完成把结果返回。 01 02 MVC架构最早是smalltalk语言研究团提出的,应用于用户交互应用程序中。MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照View、 Controller 、Model的方式进行分离,这样一个应用被分成三个层——视图层、控制层、模型层 。模型(Model)相当于人体的骨骼,里面封装了各种拥有私有属性和set/get方法的,视图(View)相当于人体展示的动作,将数据用控制层提供的方法从模型层中取出来放在视图层中展示出来,控制器(controller) 相当于人体的大脑,封装了各种读取模型层中数据的方法,主要控制各种业务逻辑。 网上体育商城的设计与实现毕业设计答辩PPT全文共15页,当前为第8页。 03 采用的技术 Hibernate是一个开源持久框架。它是由Gavin King在2001创建。简单来说,Hibernate是一个轻量级的ORM(对象关系映射)解决方案或java工具、Hibernate框架进行简化,用java开发应用程序与数据库的交互。Hibernate框架的主要优点是:比起JDBC,Hibernate没有很多复杂的SQL语句需要书。使用Hibernate框架,没有必要在JDBC中完成所有不必要的繁琐工作;域对象与关系数据库的高效映射。因此,没有必要集中精力管理数据库中的数据;它的性能更好,速度快,因为使用缓存内部处理。 04 Spring是一个完整的、模块化的轻量级框架。Spring的核心技术IoC(控制反转)和AOP(面向切面)在企业中被广泛应用,Spring框架能与大多持久层框架无缝整
好的,我可以帮你编一个Java的完整Controller实现多线程导出Excel的功能。以下是一个示例代码: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @RestController public class ExcelExportController { private final ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建一个固定线程池 @GetMapping("/export") public void exportExcel(HttpServletResponse response) { // 异步执行导出任务 executorService.execute(() -> { try { // 模拟耗时操作 Thread.sleep(3000); // 导出Excel的逻辑 // ... // 设置响应头 response.setHeader("Content-Disposition", "attachment; filename=\"export.xlsx\""); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // 输出Excel内容到响应流 // ... response.flushBuffer(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } }); } } ``` 上述代码中,我们使用Spring Boot框架创建了一个RestController,其中包含了一个GET请求的导出Excel接口`/export`。在该接口中,我们通过`executorService`定义了一个固定线程池,然后使用`execute`方法提交一个导出任务。 在导出任务中,我们首先模拟了一个耗时操作,然后执行实际的Excel导出逻辑。最后,设置响应头和内容型,并将Excel内容输出到响应流中,实现文件的下载。 请注意,上述代码只是一个示例,并没有完整的Excel导出逻辑和输出内容的实现,你需要根据自己的需求进行相应的开发。 希望能对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值