SpringMVC使用细节 第一节 视图解析器
通过HelloWorld程序我们看到了handler方法的返回值表示:
代码语言:javascript复制请求处理完成后,请SpringMVC执行一个请求转发。转发的地址就是handler方法的返回值。
假设我们在/WEB-INF/pages目录下有一组JSP页面,那么访问它们的路径都是以“/WEB-INF/pages/”开头,以“.jsp”结尾。基于这样一种情况,SpringMVC做了一种设计:它允许我们把转发路径中前面的固定部分和后面的固定部分以前缀、后缀的形式写到配置文件中,然后我们的handler方法就仅仅指定中间不一样的部分即可。中间部分和前缀、后缀做字符串拼接。这就是SpringMVC提供的视图解析器,我们在SpringMVC的配置文件中加入下面的配置,视图解析器就生效了。
代码语言:javascript复制<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
有了视图解析器,handler方法的返回值就简单了:
代码语言:javascript复制@RequestMapping("/hello")
public String hello() {
System.out.println("SpringMVC处理了这个请求!");
return "result";
}
SpringMVC会使用上面方法的返回值“result”和前缀后缀做字符串拼接,从而得到转发路径。 “/WEB-INF/pages/” “result” ".jsp"→"/WEB-INF/pages/result.jsp"
然后按照拼接得到的结果转发请求。
第二节 @RequestMapping注解使用在类级别
假设我们在同一个模块有下面几个方法:
代码语言:javascript复制@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部分提取出来即可。
代码语言:javascript复制@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方法中能够拿到吗?
代码语言:javascript复制protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
……
}
完全可以,直接从handler方法的参数位置传入即可。 2.直接传入handler方法
代码语言:javascript复制@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";
}
结果:
代码语言:javascript复制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;