在非註解的方式中,springmvc.xml文件中需要自己配置處理器映射器,處理器適配器,配置每一個控制器,並且每一個請求就要對應一個控制器類,開發很不方便。
註解方式的主要區別在於springmvc.xml文件的配置和處理器的開發代碼。
1、springmvc.xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!--設置處理器掃包範圍--> <context:component-scan base-package="rui.web"/> <!--讓SpringMvc不處理靜態資源--> <mvc:default-servlet-handler /> <!--開啓自動註冊處理器映射器和處理器適配器--> <mvc:annotation-driven /> <!--配置視圖解析器,視圖解析器用來解析處理器返回的ModelAndView對象--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp"></property> <property name="suffix" value=".jsp" ></property> </bean> </beans>
2、處理器開發
在一個控制器內的增加了兩個請求方法,請求地址分別是:
/test/index
/test/indexJson
package rui.web; import com.fasterxml.jackson.databind.ObjectMapper; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import rui.db.Model.ex_Order; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; /*測試控制器*/ @Controller @RequestMapping(value = "/test") public class TestController { @RequestMapping(value ="/index",method = RequestMethod.GET) public ModelAndView index() throws Exception { System.out.println("執行TestController"); List<ex_Order> orderList = new ArrayList<ex_Order>(); ex_Order item = new ex_Order(); item.setOrderId("T006"); item.setOrderDate(null); orderList.add(item); //創建返回的視圖對象 ModelAndView viewResult = new ModelAndView(); //添加返回的數據和視圖,視圖映射到/WEB-INF/jsp/test/index.jsp視圖 viewResult.addObject("orderList",orderList); viewResult.setViewName("/test/index"); return viewResult; } @RequestMapping(value = "indexJson") public void indexJson(HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception{ System.out.println("執行TestController"); List<ex_Order> orderList = new ArrayList<ex_Order>(); ex_Order item = new ex_Order(); item.setOrderId("T006"); item.setOrderDate(null); orderList.add(item); response.setContentType("text/html;charset=utf-8"); ObjectMapper jsonTool = new ObjectMapper(); response.getWriter().write(jsonTool.writeValueAsString(orderList)); } }
3、RequestMapping註解
可以標註在方法上,也可以標註在類上方。
RequestMapping主要包括如下的屬性:
public interface RequestMapping extends Annotation { // 指定映射的名稱 public abstract String name(); // 指定請求路徑的地址 public abstract String[] value(); // 指定請求的方式,是一個RequsetMethod數組,可以配置多個方法 public abstract RequestMethod[] method(); // 指定所需要的參數及值 public abstract String[] params(); // 指定需要包含的請求頭及值 public abstract String[] headers(); // 指定數據請求的格式 public abstract String[] consumes(); // 指定返回的內容類型 public abstract String[] produces(); }
複雜的例子:
@RequestMapping(value = {"/modifyGet.do","/modifyGet1.do"}, method={RequestMethod.POST, RequestMethod.GET}, consumes={"application/json"}, produces={"application/json"}, params={"name=mike","pwd=123456"},headers={"a=1"}) public Object addEmpGet()throws Exception { JSONObject responseObj = new JSONObject(); responseObj.put("id", 1); return responseObj ; }
value
請求的的地址,允許配置多個地址。
method
接受的Http方式,允許配置多個方式
params和headers
這兩個屬性的作用是類似的,可以對請求進一步過濾,如果輸入的參數不包含對應的屬性或者屬性的值有錯誤,那麼就會報HTTP Status [404] – [Not Found]的錯誤。
consumes
限定請求提交數據的類型方式,如果方式不匹配,則不盡興響應
produces
限定請求接受的類型,當request請求頭中的(Accept)類型中包含該指定類型纔會返回響應。