SpringMVC入門


目錄

介紹

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM