SpringMVC 定义 Controller 的几种简单方式

实现 Controller 接口

可以通过实现 Controller 接口定义 Controller ,代码如下:


@Controller("/controller")
public class HelloBeanNameUrlController implements Controller {

	@Override
	protected ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.getWriter().write("ControllerController execute..");
		return null;
	}
}

不过有时候一般不会用最顶层 Controller 接口,推荐继承子类 AbstractController,代码如下:


@Controller("/controller")
public class HelloBeanNameUrlController extends AbstractController {

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.getWriter().write("ControllerController execute..");
		return null;
	}
}

实现 Controller 接口其实相当于 @Controller + @RequestMapping 这组注解功能,需要处理数据并且返回视图。

实现 HttpRequestHandler 接口

也可以实现 HttpRequestHandler 接口定义 Controller 类,代码如下:


@Controller("/hello")
public class HelloHttpRequestHandler implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 这种方式获取的 request 也是一样的,可以解决在同一个线程中不用传参的问题,底层其实就是从 ThreadLocal 中获取值
		// ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		// HttpServletRequest request1 = requestAttributes.getRequest();

		response.getWriter().write("hello HttpRequestHandler.....");
	}
}

或者这里可以不用 @Controller(“/hello”) 注解,直接使用 @Component ,但是需要自己在 SimpleUrlConfig 类上建立映射关系,代码如下:

@Component
public class HelloHttpRequestHandler implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 这种方式获取的 request 也是一样的,可以解决在同一个线程中不用传参的问题,底层其实就是从 ThreadLocal 中获取值
		// ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
		// HttpServletRequest request1 = requestAttributes.getRequest();

		response.getWriter().write("hello HttpRequestHandler.....");
	}
}

@Configuration
public class SimpleUrlConfig {

	@Bean
	public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
		SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
		Properties properties = new Properties();
		properties.put("abc/simpleUrlHandler","helloHttpRequestHandler");

		simpleUrlHandlerMapping.setMappings(properties);
		return simpleUrlHandlerMapping;
	}
}

上述所有写法更多出现在源码中,因为在源码中内置的 Handler 和 url 都会建立映射关系。开发中较少用,不够灵活,一个 url 需对应一个类,有点大题小做。 但是有时候需要在代码中满足某些条件建立映射关系,就可以通过这种配置类来实现。

实现 HttpRequestHandler 接口相当于 @RestController + @RequestMapping 这组注解功能,只需要处理并返回数据,无需渲染视图。所以从这里可以知道每个接口设计都有它的意义。

@RequestMapping 注解

所以最多的都是通过 @RequestMapping 注解来在类中定义多个方法,每个方法对应处理一个 url 请求。这样就不用写过多的 Controller 类。代码如下:


@Controller
public class HelloRequestMappingController {
	@GetMapping("/helloReq")
	public String hello(Model model) {
		System.out.println("hello springMVC"+model.getAttribute("name"));
		// 测试自定义视图解析器功能
		return "meinv:";
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔道不误砍柴功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值