实现 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:";
}
}