1.@RequestMapping 用法
SpringMVC中,@RequestMapping用來處理請求,比如XXX.do
@RequestMapping("/aaa")//類級別,可以不需要,如果要了,下面所有的請求路徑前都需要加入/aaa
public class ccccontroller{
@RequestMapping("/bbb")
//方法級別,必須有,決定這個方法處理哪個請求,如果有類級別 /aaa/bbb
public String xxx()
{
//如果沒有類級別的就直接請求/bbb
return;
}
}
public String start(@PathVariable("name") string name){ //和上面的對應(yīng)
return ;//方法體里面就可以直接獲得參數(shù)
}
Servlet中用Filter重寫示例
web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns=" http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>Action</servlet-name>
<servlet-class>com.bao.servlet.Action</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Action</servlet-name>
<url-pattern>/Action</url-pattern>
</servlet-mapping>
<filter>
<filter-name>action_name</filter-name>
<filter-class>com.bao.filter.ActionNameFilter</filter-class>
<init-param>
<param-name>pattern</param-name>
<param-value>/action/[^/]+</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>action_name</filter-name>
<url-pattern>/action/*</url-pattern>
</filter-mapping>
</web-app>
controller接收參數(shù)的使用
springmvc提供了@RequestParam注釋幫助我們獲取參數(shù)。
用法@RequestParam("接收的參數(shù)名")
例如:
@RequestMapping(params="servlet=login")
public String login(@RequestParam("username")String username,@RequestParam("password")String password,HttpServletRequest request,ModelMap map){
//處理登錄邏輯,省略
return "success";
}
當(dāng)客戶端的URL提交了username參數(shù),password參數(shù),那么我們的Controller就可以接收并處理了。
要注意,提交的username參數(shù)和password參數(shù)不可以是null,即一定要傳這兩個參數(shù),不然會拋異常。
另外,@RequestParam可以省略參數(shù)名,那么就會以它注釋的變量名作為參數(shù)名。
視圖名的確定。
spring mvc可以通過可以通過多種方式確定視圖名,在前面的例子中,方法無返回值,視圖名根據(jù)請求參數(shù)確定。Controller方法還是返回一個String類型的值作為視圖名,如:
@RequestMapping("edit")
public void edit(@RequestParam int id) {...}
則返回的視圖為../edit.jsp
使用過低版本 Spring MVC 的讀者都知道:當(dāng)創(chuàng)建一個 Controller 時,我們需要直接或間接地實現(xiàn) org.springframework.web.servlet.mvc.Controller 接口。一般情況下,我們是通過繼承 SimpleFormController 或 MultiActionController 來定義自己的 Controller 的。在定義 Controller 后,一個重要的事件是在 Spring MVC 的配置文件中通過 HandlerMapping 定義請求和控制器的映射關(guān)系,以便將兩者關(guān)聯(lián)起來。
來看一下基于注解的 Controller 是如何定義做到這一點的,下面是使用注解的 BbtForumController:
從上面代碼中,我們可以看出 BbtForumController 和一般的類并沒有區(qū)別,它沒有實現(xiàn)任何特殊的接口,因而是一個地道的 POJO。讓這個 POJO 與眾不同的魔棒就是 Spring MVC 的注解! 在 ① 處使用了兩個注解,分別是 @Controller 和 @RequestMapping。在“使用 Spring 2.5 基于注解驅(qū)動的 IoC”這篇文章里,筆者曾經(jīng)指出過 @Controller、@Service 以及 @Repository 和 @Component 注解的作用是等價的:將一個類成為 Spring 容器的 Bean。由于 Spring MVC 的 Controller 必須事先是一個 Bean,所以 @Controller 注解是不可缺少的。 真正讓 BbtForumController 具備 Spring MVC Controller 功能的是 @RequestMapping 這個注解。@RequestMapping 可以標注在類定義處,將 Controller 和特定請求關(guān)聯(lián)起來;還可以標注在方法簽名處,以便進一步對請求進行分流。在 ① 處,我們讓 BbtForumController 關(guān)聯(lián)“/forum.do”的請求,而 ② 處,我們具體地指定 listAllBoard() 方法來處理請求。所以在類聲明處標注的 @RequestMapping 相當(dāng)于讓 POJO 實現(xiàn)了 Controller 接口,而在方法定義處的 @RequestMapping 相當(dāng)于讓 POJO 擴展 Spring 預(yù)定義的 Controller(如 SimpleFormController 等)。 為了讓基于注解的 Spring MVC 真正工作起來,需要在 Spring MVC 對應(yīng)的 xxx-servlet.xml 配置文件中做一些手腳。在此之前,還是先來看一下 web.xml 的配置吧: web.xml 中定義了一個名為 annomvc 的 Spring MVC 模塊,按照 Spring MVC 的契約,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定義 Spring MVC 模塊的具體配置。annomvc-servlet.xml 的配置內(nèi)容如下所示: 因為 Spring 所有功能都在 Bean 的基礎(chǔ)上演化而來,所以必須事先將 Controller 變成 Bean,這是通過在類中標注 @Controller 并在 annomvc-servlet.xml 中啟用組件掃描機制來完成的,如 ① 所示。 在 ② 處,配置了一個 AnnotationMethodHandlerAdapter,它負責(zé)根據(jù) Bean 中的 Spring MVC 注解對 Bean 進行加工處理,使這些 Bean 變成控制器并映射特定的 URL 請求。 而 ③ 處的工作是定義模型視圖名稱的解析規(guī)則,這里我們使用了 Spring 2.5 的特殊命名空間,即 p 命名空間,它將原先需要通過 <property> 元素配置的內(nèi)容轉(zhuǎn)化為 <bean> 屬性配置,在一定程度上簡化了 <bean> 的配置。 啟動 Tomcat,發(fā)送 http://localhost/forum.do URL 請求,BbtForumController 的 listAllBoard() 方法將響應(yīng)這個請求,并轉(zhuǎn)向 WEB-INF/jsp/listBoard.jsp 的視圖頁面。 在controller中,如果在某方法中需要重定向則 return "redirect:xx.html"(與類的RequestMapping的值在同一個路徑下)
import com.baobaotao.service.BbtForumService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Collection;
@Controller //<——①
@RequestMapping("/forum.do")
public class BbtForumController {
@Autowired
private BbtForumService bbtForumService;
@RequestMapping //<——②
public String listAllBoard() {
bbtForumService.getAllBoard();
System.out.println("call listAllBoard method.");
return "listBoard";
}
}
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Spring Annotation MVC Sample</display-name>
<!-- Spring 服務(wù)層的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Spring 容器啟動監(jiān)聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Spring MVC 的Servlet,它將加載WEB-INF/annomvc-servlet.xml 的
配置文件,以啟動Spring MVC模塊-->
<servlet>
<servlet-name>annomvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>annomvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- ①:對web包中的所有類進行掃描,以完成Bean創(chuàng)建和自動依賴注入的功能 -->
<context:component-scan base-package="com.baobaotao.web"/>
<!-- ②:啟動Spring MVC的注解功能,完成請求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.
AnnotationMethodHandlerAdapter"/>
<!-- ③:對模型視圖名稱的解析,即在模型視圖名稱添加前后綴 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
</beans>