天天看點

SpringMVC開發流程

SpringMVC開發流程
要點
  • SpringMVC簡介
  • 搭建環境入門程式
  • 全注解
    • J2EE三層使用的注解
    • 使用步驟
    • 對靜态資源的處理
  • 傳參方式
    • 原始方式request.getParameter()
    • 方法形參與前台參數同名
    • 對象傳參
    • 位址欄傳參
    • 中文亂碼處理
  • 傳值方式
    • 通過request.setAttribute()
    • addObject()的方式
    • 直接傳回對象
    • 配置視圖解析器
    • forward方式
    • redirect方式
    • 通過Model方式
  • 檔案上傳/下載下傳
    • 檔案上傳
    • 配置檔案上傳解析器
    • 上傳方法參數MultipartFile
    • 檔案下載下傳
  • 攔截器
    • preHandle方法
    • postHandle方法
    • afterCompletion方法
  • 傳回JSON格式資料
  • 日期處理
    • 前台往背景傳參
    • 背景往前台回顯值(JSON)

1.SpringMVC簡介

SpringMVC屬于SpringFrameWork的後續産品,已經融合在Spring Web Flow裡面。Spring 架構提供了建構 Web 應用程式的全功能 MVC 子產品。使用 Spring 可插入的 MVC 架構,進而在使用Spring進行WEB開發時,可以選擇使用Spring的SpringMVC架構或內建其他MVC開發架構,如Struts1,Struts2等,在這裡暫時就不分析SpringMVC與Struts2的比較了.

2.搭建環境入門程式

需要的jar包(需要什麼包添加什麼包就不一下全部添加進去了 )

1)添加Spring的核心包

SpringMVC開發流程

圖檔.png

com.springsource.org.apache.commons.logging-1.1.1.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
           

添加web.xml檔案,使用3.0或以上的版本,3.0以下的對el表達式不是很智能,需要配置isELIgnored="false"

配置前端控制器

<!--前端控制器/請求分發器-->
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-mvc.xml</param-value>
    </init-param>
    <!--設定優先級-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
           
SpringMVC開發流程

建立自定義的Controller類,實作Controller接口.複寫handleRequest方法

public class HelloWorldController implements Controller {

@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  //建立自定義Controller類,實作contrller接口複寫handleRequest方法
   request.setAttribute("msg","hello!");
   request.getRequestDispatcher("/hello.jsp").forward(request,response);
    return null;
}
}
           
SpringMVC開發流程

配置Controller的映射路徑,并且交給spring來管理bean

<!--name請求的映射路徑 class:該路徑處理類-->
<bean name="/index" class="com.jd.controller.HelloWorldController"></bean>
           
SpringMVC開發流程

讓架構去找我們自定義的檔案名與路徑

<init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-mvc.xml</param-value>
    </init-param>
           
SpringMVC開發流程

第一次通路的時候才去加載架構

如果類很多,那麼第一次通路就會很慢

<!--設定優先級-->
 <load-on-startup>1</load-on-startup>
           

3.使用注解的方式

1.在類打上@Controller注解

2.在方法上添加@RequestMapping注解

3.在springmvc的配置檔案上開啟注解掃描

public class EmployeeController  {
@RequestMapping("/employee")
public void employee(HttpServletRequest requst, HttpServletResponse response) throws Exception {
    //方法中需要什麼對象就寫到形參上
    requst.setAttribute("msg","employee!!!!!!!!");
    requst.getRequestDispatcher("/hello.jsp").forward(requst,response);
}
           
SpringMVC開發流程

必須開啟注解掃描

<!--開啟注解掃描-->
<context:component-scan base-package="com.jd.controller"></context:component-scan>
           

@RequestMapping可以打在類上也可以打在方法上

如果是打在類上,必須先加類上的映射,再加方法的映射

SpringMVC開發流程

4.靜态資源處理

1./和/的差別

/: 會比對到url路徑(/index),靜态資源(.html,.js等),但是不會比對到.jsp

/: 會比對到url路徑(/index),靜态資源(.html,.js等),也會比對到.jsp

2.為什麼springmvc不能使用/*

Struts2裡面是有自定義标簽 s:form,jsp檔案必須要交有struts2來解析, 是以才會用到/*

SpringMVC是沒有自定義标簽的,也不能處理jsp檔案,是以jsp檔案必須交回tomcat來處理,是以才會用/,不過濾jsp檔案

3.springmvc比對到靜态資源的時候出現的重定向錯誤問題

當我們在浏覽器通路

http://localhost/dept.html

,此時的dept.html路徑就會被當做url的映射路徑來比對

就會去找@RequestMapping有沒有比對到的路徑,如果有的話就把dept.html當做url路徑來通路(/dept.???) ?是不會加進去比對的

也就是說通路dept.html時,隻要有dept的路徑就可以比對到

解決方案:

方案 1 交由tomcat來處理,tomcat中的default本來就是處理靜态資源的

SpringMVC開發流程

方案2. 配置springmvc處理靜态資源(先比對url是否有相同的路徑,如果有就交由方法處理,如果沒有才當做靜态資源處理)(推薦使用)

<!--springMVC的靜态資源處理配置-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
           
SpringMVC開發流程

5.前台往背景傳參的方式

@Controller
public class ParamController {

@RequestMapping("/login")
  public void login(HttpServletRequest request){
// 1.原始方式 使用request來擷取參數
 System.out.println(request.getParameter("username"));
 System.out.println(request.getParameter("password"));
}
           

2.使用同名比對的方式

@RequestMapping("/login")
public void login(String username,String password){
System.out.println(("username"));
System.out.println(("password"));
}
           

// 3.使用對象的方式

@RequestMapping("/login")
public void login(User user){
    System.out.println((user));
}
           

//4.位址欄傳參

@RequestMapping("/delete/{id}")
 public void delete(@PathVariable("id") Long id){
 System.out.print(id);
 }
           
SpringMVC開發流程

6.解決中文亂碼問題(post)

<!--編碼過濾器 隻對post請求有效-->
<filter>
    <filter-name>characterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>endoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
           
SpringMVC開發流程

7.背景往前台傳值

//背景往前台傳值
public class ValueController {
//1.使用原始方式傳值
@RequestMapping("/value")
public void value(HttpServletRequest requst, HttpServletResponse response) throws Exception {
    //方法中需要什麼對象就寫到形參上
    requst.setAttribute("msg", "value!!!!!!!!");
    requst.getRequestDispatcher("/hello.jsp").forward(requst, response);
}

//2.使用ModelAndView對象
@RequestMapping("value1")
public ModelAndView value() throws Exception {
    ModelAndView mv = new ModelAndView();
    //設定屬性
    mv.addObject("name", "CoderZS");
    mv.addObject("password", "123");
    User user = new User("zhangsan", "1234");
    mv.addObject("user", user);
    //mv.addObject(user);
    mv.addObject("maYun");//設定預設key為目前對象類型(小寫開頭)
    mv.addObject("hahaha");//後面設定相同類型的值會覆寫之前的值

    Map map = new HashMap<>();
    map.put("name1", "laowang");
    map.put("password", "12344");
    mv.addAllObjects(map);

    //設定視圖
    mv.setViewName("/hello.jsp");
    return mv;
}

//3.直接傳回對象
//此時會尋找視圖解析器中[字首+value2+字尾]的頁面/WEB-INF/views/value2.jsp
@RequestMapping("/value2")
public User getUser() {
    return new User("CoderZS", "1234");
}

//注意傳回String的時候會當做視圖解析(推薦使用)
//如果傳回的類型是String就會把傳回值當做使徒的一部分
//最終去尋找的路徑[字首+傳回的值+字尾]
//WEB-INF/views/vvv.jsp
@RequestMapping("/value3")
public String getString(Model model) {
    model.addAttribute("name", "coderZS");
    return "vvv";
}

//4.通路其他路徑的檔案,不需要用到前字尾
@RequestMapping("/value4")
public String getString() {
    //希望通路其他路徑的檔案,就不需要用到字首字尾
    //forward:login.html //請求轉發
    return "redirect:login.html";//重定向
}
}
           

8.檔案上傳

SpringMVC開發流程

表單.png

//檔案上傳
@RequestMapping("/upload")
//  在方法形參上添加MultipartFile對象來接收(不能使用File來接收了)
public void upload(MultipartFile file) throws Exception {
    System.out.println(file.getName());//送出表單的檔案的參數名
    System.out.println(file.getContentType());//檔案類型
    System.out.println(file.getOriginalFilename());//送出的檔案名
    System.out.println(file.getSize());//檔案大小
    //拷貝檔案
    FileOutputStream outputStream = new FileOutputStream("/Users/zhangshuai/Desktop/file" + file.getOriginalFilename());
    IOUtils.copy(file.getInputStream(), outputStream);
    //關閉輸出流
    outputStream.close();
}
           
SpringMVC開發流程

添加檔案上傳解析器

<!--檔案上傳解析器-->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 設定上傳檔案的最大尺寸為1MB -->
    <property name="maxUploadSize">
        <value>1048576</value>
    </property>
</bean>
           
SpringMVC開發流程

9.檔案下載下傳

//檔案下載下傳
@RequestMapping("/download")
public  void download(HttpServletResponse response) throws Exception {
    System.out.println("---下載下傳-----");
    //設定下載下傳響應頭
    response.setHeader("Content-Disposition","attachment;filename=a.jpg");
    //讀取檔案
    FileInputStream inputStream=new FileInputStream("/Users/zhangshuai/Desktop/file/1.jpg");
    IOUtils.copy(inputStream, response.getOutputStream());
    //關閉輸入流
    inputStream.close();
}
           
SpringMVC開發流程

10.注冊攔截器

  1. 建立自定義的攔截器類,實作HandlerInterceptor接口
SpringMVC開發流程

2.注冊攔截器

<!--注冊攔截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <!--排除攔截的路徑-->
        <mvc:exclude-mapping path="/login"/>
        <!--攔截處理類-->
        <bean class="com.jd.interceptor.LoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
           
SpringMVC開發流程

11.傳回json格式

在方法的傳回值上直接聲明要傳回的類型,并且加上@ResponseBody注解

需要添加json解析依賴包

SpringMVC開發流程
//傳回json格式
// 1.在方法的傳回值上直接聲明要傳回的類型,并且加上@ResponseBody注解
 @Controller
public class JsonController {
@RequestMapping("/json")
@ResponseBody
public User json() {
    User user = new User("CoderZS", "1234");
    return user;
}

@RequestMapping("/json1")
@ResponseBody
public List<User> json1() {
    User user = new User("CoderZS", "1234",new Date());
    List list = new ArrayList<>();
    list.add(user);
    return list;
}

//2.使用ObjectMapper
public static void main(String[] args) throws Exception {
    User user = new User("CoderZS", "1234");
    //轉成json字元串的工具
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);
    System.out.println(json);
}
}
           

12.日期處理

背景往前台傳json值時(包含日期)

預設輸出的是毫秒值,需要使用特定的格式

方案1:在屬性上添加@JsonFormat注解,注意要添加時區

SpringMVC開發流程

方案2: 在總配置檔案添加相關配置

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="dateFormat">
                        <bean class="java.text.SimpleDateFormat">
                            <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
           

前台往背景傳參時(包含日期)

1.在日期參數上添加@DateTimeFormat注解

SpringMVC開發流程

2.在Controller上添加initBinder方法

@InitBinder
public void initBinder(WebDataBinder binder){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    sdf.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
           

如果兩種都有,會使用initBinder方法

13.圖解SpringMVC執行流程

SpringMVC開發流程

執行流程.png

SpringMVC開發流程

SpringMVC執行流程.png

點選檢視--->SpringMVC執行流程及原理