Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

SpringMVC使用细节
第一节 视图解析器

通过HelloWorld程序我们看到了handler方法的返回值表示:

请求处理完成后,请SpringMVC执行一个请求转发。转发的地址就是handler方法的返回值。

假设我们在/WEB-INF/pages目录下有一组JSP页面,那么访问它们的路径都是以“/WEB-INF/pages/”开头,以“.jsp”结尾。基于这样一种情况,SpringMVC做了一种设计:它允许我们把转发路径中前面的固定部分和后面的固定部分以前缀、后缀的形式写到配置文件中,然后我们的handler方法就仅仅指定中间不一样的部分即可。中间部分和前缀、后缀做字符串拼接。这就是SpringMVC提供的视图解析器,我们在SpringMVC的配置文件中加入下面的配置,视图解析器就生效了。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

有了视图解析器,handler方法的返回值就简单了:

@RequestMapping("/hello")
public String hello() {
System.out.println(“SpringMVC处理了这个请求!”);
return “result”;
}

SpringMVC会使用上面方法的返回值“result”和前缀后缀做字符串拼接,从而得到转发路径。
“/WEB-INF/pages/”+“result”+".jsp"→"/WEB-INF/pages/result.jsp"

然后按照拼接得到的结果转发请求。

第二节 @RequestMapping注解使用在类级别

假设我们在同一个模块有下面几个方法:

@RequestMapping("/user/login")
public String login() {
return “result”;
}

@RequestMapping("/user/register")
public String register() {
return “result”;
}

@RequestMapping("/user/logout")
public String logout() {
return “result”;
}

它们在@RequestMapping注解中的映射地址都是以/user开头,能否统一提取出来呢?很简单,在类上再使用一个@RequestMapping注解把/user部分提取出来即可。

@Controller
@RequestMapping("/user")
public class UserHandler {
@RequestMapping("/login")
public String login() {
return “result”;
}
@RequestMapping("/register")
public String register() {
return “result”;
}
@RequestMapping("/logout")
public String logout() {
return “result”;
}
}

访问的效果是一样的。

第三节 获取原生Servlet API对象
1.提出问题
在Servlet的doGet()方法中,我们可以拿到原生、本真的HttpServletRequest和HttpServletResponse这样的对象,那么在SpringMVC的handler方法中能够拿到吗?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
……
}

完全可以,直接从handler方法的参数位置传入即可。
2.直接传入handler方法

@RequestMapping("/testOriginalObject")
public String testOriginalObject( HttpServletRequest request, HttpServletResponse response, HttpSession session) {
System.out.println(request);
System.out.println(response);
System.out.println(session);
return “result”;
}

结果:

org.apache.catalina.connector.RequestFacade@d57f488
org.apache.catalina.connector.ResponseFacade@3b9b53b
org.apache.catalina.session.StandardSessionFacade@27f11e41

3.ServletContext对象
方法一:通过HttpSession对象获取
session.getServletContext()
方法二:使用@Autowired注解装配
@Autowired
private ServletContext servletContext;