Spring MVC框架:第二章:視圖解析器和@RequestMapping注解使用在類(lèi)級(jí)別及獲取原生Servlet API對(duì)象
SpringMVC使用細(xì)節(jié)
第一節(jié) 視圖解析器
通過(guò)HelloWorld程序我們看到了handler方法的返回值表示:
請(qǐng)求處理完成后,請(qǐng)SpringMVC執(zhí)行一個(gè)請(qǐng)求轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)的地址就是handler方法的返回值。
假設(shè)我們?cè)?WEB-INF/pages目錄下有一組JSP頁(yè)面,那么訪問(wèn)它們的路徑都是以“/WEB-INF/pages/”開(kāi)頭,以“.jsp”結(jié)尾?;谶@樣一種情況,SpringMVC做了一種設(shè)計(jì):它允許我們把轉(zhuǎn)發(fā)路徑中前面的固定部分和后面的固定部分以前綴、后綴的形式寫(xiě)到配置文件中,然后我們的handler方法就僅僅指定中間不一樣的部分即可。中間部分和前綴、后綴做字符串拼接。這就是SpringMVC提供的視圖解析器,我們?cè)赟pringMVC的配置文件中加入下面的配置,視圖解析器就生效了。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
有了視圖解析器,handler方法的返回值就簡(jiǎn)單了:
@RequestMapping("/hello")
public String hello() {
System.out.println(“SpringMVC處理了這個(gè)請(qǐng)求!”);
return “result”;
}
SpringMVC會(huì)使用上面方法的返回值“result”和前綴后綴做字符串拼接,從而得到轉(zhuǎn)發(fā)路徑。
“/WEB-INF/pages/”+“result”+".jsp"→"/WEB-INF/pages/result.jsp"
然后按照拼接得到的結(jié)果轉(zhuǎn)發(fā)請(qǐng)求。
第二節(jié) @RequestMapping注解使用在類(lèi)級(jí)別
假設(shè)我們?cè)谕粋€(gè)模塊有下面幾個(gè)方法:
@RequestMapping("/user/login")
public String login() {
return “result”;
}
@RequestMapping("/user/register")
public String register() {
return “result”;
}
@RequestMapping("/user/logout")
public String logout() {
return “result”;
}
它們?cè)贎RequestMapping注解中的映射地址都是以/user開(kāi)頭,能否統(tǒng)一提取出來(lái)呢?很簡(jiǎn)單,在類(lèi)上再使用一個(gè)@RequestMapping注解把/user部分提取出來(lái)即可。
@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”;
}
}
訪問(wèn)的效果是一樣的。
第三節(jié) 獲取原生Servlet API對(duì)象
1.提出問(wèn)題
在Servlet的doGet()方法中,我們可以拿到原生、本真的HttpServletRequest和HttpServletResponse這樣的對(duì)象,那么在SpringMVC的handler方法中能夠拿到嗎?
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
……
}
完全可以,直接從handler方法的參數(shù)位置傳入即可。
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”;
}
結(jié)果:
org.apache.catalina.connector.RequestFacade@d57f488
org.apache.catalina.connector.ResponseFacade@3b9b53b
org.apache.catalina.session.StandardSessionFacade@27f11e41
3.ServletContext對(duì)象
方法一:通過(guò)HttpSession對(duì)象獲取
session.getServletContext()
方法二:使用@Autowired注解裝配
@Autowired
private ServletContext servletContext;