目錄
介紹
SpringMVC是一款Web MVC框架。 它跟Struts框架類似,是目前主流的Web MVC框架之一。
本文通過實例來介紹SpringMVC的入門知識。
實例
本文所寫的實例是一個員工的CRUD demo。 用idea編寫,基於maven, Web框架使用SpringMVC,視圖采取Freemarker技術,數據庫使用MySQL,用Hibernate4存儲數據。
本文關於其他一些內容 如maven的pom文件內容,spring常規bean,事務,數據源的配置等不會詳細描述,可自行下載代碼查看
項目文件目錄如下:
首先在web.xml中配置入口servlet
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springConfig/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
注意有個初始參數 contextConfigLocation, 顧名思義 上下文配置文件路徑。
還有另外一個注意點,這個servlet對應的url-pattern最好寫成 "/", 不要寫成 "/*"。 至於為什么需要寫成 "/" , 具體請參考http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html#springmvc
在dispatcher-servlet.xml中主要是配置springmvc的一些Controller的初始化,靜態文件的映射策略,視圖的配置等。
然后開始編寫Controller類(類似Struts2中的Action)
首先來看一個主頁的Controller:
@Controller @RequestMapping("/") public class IndexController { @RequestMapping public ModelAndView index() { ModelAndView view = new ModelAndView("index"); view.addObject("welcome", "hello"); return view; } }
這里有2個注解: @Controller和@RequestMapping
@Controller注解就是表明這是一個Controller,且會被spring容器進行初始化。
dispatcher-servlet.xml中的掃描包配置語句:
<context:component-scan base-package="org.format.demo.controller" />
這條語句是掃描org.format.demo.controller下被@Controller(還有其他的如 @Component, @Service, @Repository)注解的那些類,並進行實例化。
@RequestMapping 顧名思義,就是請求映射。
我們看到@RequestMapping("/")中的"/"的意義就是contextPath后面的路徑;也就是 http://host:port/contextPath 后面的路徑。 (這里不一定都要以"/"開頭,比如 "/employee", 我們可以寫成 "employee" )
ModelAndView對象就是一個帶模型的視圖對象。 我們看到IndexController返回了1個index名稱的ModelAndView對象。
addObject對象就類似HttpServletRequest的setAttribute對象,也就是視圖里面丟數據。 我們看到丟了一個key為welcome的對象。
最后的視圖代碼:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <h2>Welcome to user SpringMVC</h2> <h3>your welcome param: ${welcome}</h3> </body> </html>
我們看到用了el表達式得到了丟入的數據welcome,也就是hello。 因此,最終生成的頁面及地址如下:
最后SpringMVC會通過配置文件中的視圖對象拼接成最終的視圖地址。
圖中viewName也就是返回的ModelAndView中的viewName 即index。 因此,最終的視圖路徑為 /WEB-INF/view/index.ftl。
下面在來看一個員工操作的Controller代碼:
@Controller @RequestMapping(value = "/employee") public class EmployeeController { @Autowired private IEmployeeService employeeService; @Autowired private IDeptService deptService; @RequestMapping public ModelAndView index() { ModelAndView view = new ModelAndView("employee/list"); List<Employee> employees = employeeService.list(); view.addObject("list", employees); return view; } @RequestMapping(method = RequestMethod.POST, value = "/delete/{employeeId}") @ResponseBody public String delete(@PathVariable Integer employeeId) { employeeService.delete(employeeId); return "success"; } @RequestMapping(method = RequestMethod.GET, value = "/add") public ModelAndView add(ModelAndView view) { view.setViewName("employee/form"); view.addObject("depts", deptService.listAll()); return view; } @RequestMapping(method = RequestMethod.GET, value = "/detail/{employeeId}") public ModelAndView detail(@PathVariable Integer employeeId, ModelAndView view) { view.setViewName("employee/form"); view.addObject("employee", employeeService.getById(employeeId)); view.addObject("depts", deptService.listAll()); return view; } @RequestMapping(method = RequestMethod.POST, value = "/update") public String add(Employee employee) { if(employee.getDept().getId() == null) { employee.setDept(null); } employeeService.saveOrUpdate(employee); return "redirect:/employee/"; } }
這里多了幾個新的內容:
1. @RequestMapping注解的作用位置
@RequestMapping可以作用在類名上,也可以作用在方法上。 如果都有, 產生作用的路徑是類名上的路徑+方法上的路徑。 比如EmployeeController的add方法,最終起作用的路徑是 http://host:port/contextPath/employee/add
2. @RequestMapping注解的method參數
method參數表示的HTTP請求的方式。常見的有GET,PUT,POST,DELETE等。若請求的方法與后台編寫的方法不一致,會出現HTTP 405錯誤。
3. @PathVariable注解
這是一種基於RESTFUL的注解。我們看到detail方法的@RequestMapping的value值/detail/{employeeId},參數中加入了一個@PathVariable employeeId。 這樣起作用的路徑就根據employee的Id,即每個員工都有獨立的一個URI路徑資源。 符合RESTFUL架構。
4. Controller的方法參數
Controller的方法訪問非常靈活。 比如Employee有id,name,age等屬性。 只要我們在前台傳入name為id,name,age這3個參數,並且接受的方法有一個Employee對象參數,SpringMVC會自動把3個注入到這個對象中。 還有其他一些Integer,Long參數等,SpringMVC會默認幫我們自動轉化。 同時參數也可以丟入一些HttpServletRequest, HttpServletResponse, HttpServletSession對象,SpringMVC會自動幫我們注入。 這點非常方便。
5. 不帶參數基於方法的@RequestMapping會被當然基於類的@RequestMapping所作用的地址的默認進入的方法
add方法。 get請求
detail方法。 RESTFUL風格
delete方法。RESTFUL風格
總結
SpringMVC是一個Web MVC框架。 它的特點是輕便,與Spring無縫整合,上手簡單。它的易用性、可擴展性、安全性均非常理想。
參考資料
http://www.ruanyifeng.com/blog/2011/09/restful.html
http://jinnianshilongnian.iteye.com/blog/1593441
代碼下載地址: http://files.cnblogs.com/fangjian0423/SpringMVCDemo.zip