SpringMVC開發(fā)流程

要點

  • SpringMVC簡介
  • 搭建環(huán)境入門程序
  • 全注解
    • J2EE三層使用的注解
    • 使用步驟
    • 對靜態(tài)資源的處理
  • 傳參方式
    • 原始方式request.getParameter()
    • 方法形參與前臺參數(shù)同名
    • 對象傳參
    • 地址欄傳參
    • 中文亂碼處理
  • 傳值方式
    • 通過request.setAttribute()
    • addObject()的方式
    • 直接返回對象
    • 配置視圖解析器
    • forward方式
    • redirect方式
    • 通過Model方式
  • 文件上傳/下載
    • 文件上傳
    • 配置文件上傳解析器
    • 上傳方法參數(shù)MultipartFile
    • 文件下載
  • 攔截器
    • preHandle方法
    • postHandle方法
    • afterCompletion方法
  • 返回JSON格式數(shù)據(jù)
  • 日期處理
    • 前臺往后臺傳參
    • 后臺往前臺回顯值(JSON)

1.SpringMVC簡介

SpringMVC屬于SpringFrameWork的后續(xù)產品谓苟,已經融合在Spring Web Flow里面。Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊协怒。使用 Spring 可插入的 MVC 架構涝焙,從而在使用Spring進行WEB開發(fā)時,可以選擇使用Spring的SpringMVC框架或集成其他MVC開發(fā)框架孕暇,如Struts1仑撞,Struts2等,在這里暫時就不分析SpringMVC與Struts2的比較了.

2.搭建環(huán)境入門程序

需要的jar包(需要什么包添加什么包就不一下全部添加進去了 )
1)添加Spring的核心包


圖片.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"
配置前端控制器

 <!--前端控制器/請求分發(fā)器-->
<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>
    <!--設置優(yōu)先級-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
圖片.png

創(chuàng)建自定義的Controller類,實現(xiàn)Controller接口.復寫handleRequest方法

public class HelloWorldController implements Controller {

@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  //創(chuàng)建自定義Controller類,實現(xiàn)contrller接口復寫handleRequest方法
   request.setAttribute("msg","hello!");
   request.getRequestDispatcher("/hello.jsp").forward(request,response);
    return null;
}
}
圖片.png

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

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

圖片.png

讓框架去找我們自定義的文件名與路徑

    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-mvc.xml</param-value>
    </init-param>
圖片.png

第一次訪問的時候才去加載框架
如果類很多,那么第一次訪問就會很慢

 <!--設置優(yōu)先級-->
 <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);
}
圖片.png

必須開啟注解掃描

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

@RequestMapping可以打在類上也可以打在方法上
如果是打在類上,必須先加類上的映射,再加方法的映射

圖片.png

4.靜態(tài)資源處理

1./和/的區(qū)別
/: 會匹配到url路徑(/index),靜態(tài)資源(
.html,.js等),但是不會匹配到.jsp
/: 會匹配到url路徑(/index),靜態(tài)資源(.html,.js等),也會匹配到.jsp

2.為什么springmvc不能使用/*
Struts2里面是有自定義標簽 s:form,jsp文件必須要交有struts2來解析, 所以才會用到/*
SpringMVC是沒有自定義標簽的,也不能處理jsp文件,所以jsp文件必須交回tomcat來處理,所以才會用/,不過濾jsp文件

3.springmvc匹配到靜態(tài)資源的時候出現(xiàn)的重定向錯誤問題
當我們在瀏覽器訪問http://localhost/dept.html,此時的dept.html路徑就會被當做url的映射路徑來匹配
就會去找@RequestMapping有沒有匹配到的路徑,如果有的話就把dept.html當做url路徑來訪問(/dept.???) ?是不會加進去匹配的
也就是說訪問dept.html時,只要有dept的路徑就可以匹配到

解決方案:
方案 1 交由tomcat來處理,tomcat中的default本來就是處理靜態(tài)資源的

圖片.png

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

 <!--springMVC的靜態(tài)資源處理配置-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
圖片.png

5.前臺往后臺傳參的方式

@Controller
public class ParamController {

@RequestMapping("/login")
  public void login(HttpServletRequest request){
// 1.原始方式 使用request來獲取參數(shù)
 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);
 }
圖片.png

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>
圖片.png

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 //請求轉發(fā)
    return "redirect:login.html";//重定向
}
}

8.文件上傳

表單.png
 //文件上傳
@RequestMapping("/upload")
//  在方法形參上添加MultipartFile對象來接收(不能使用File來接收了)
public void upload(MultipartFile file) throws Exception {
    System.out.println(file.getName());//提交表單的文件的參數(shù)名
    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();
}
圖片.png

添加文件上傳解析器

 <!--文件上傳解析器-->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 設置上傳文件的最大尺寸為1MB -->
    <property name="maxUploadSize">
        <value>1048576</value>
    </property>
</bean>
圖片.png

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();
}
圖片.png

10.注冊攔截器

  1. 創(chuàng)建自定義的攔截器類,實現(xiàn)HandlerInterceptor接口
圖片.png

2.注冊攔截器

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

11.返回json格式

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

需要添加json解析依賴包

圖片.png
//返回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注解,注意要添加時區(qū)

圖片.png

方案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.在日期參數(shù)上添加@DateTimeFormat注解

圖片.png

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執(zhí)行流程

執(zhí)行流程.png
SpringMVC執(zhí)行流程.png

點擊查看--->SpringMVC執(zhí)行流程及原理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芭商,隨后出現(xiàn)的幾起案子派草,更是在濱河造成了極大的恐慌,老刑警劉巖铛楣,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件近迁,死亡現(xiàn)場離奇詭異,居然都是意外死亡簸州,警方通過查閱死者的電腦和手機鉴竭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岸浑,“玉大人搏存,你說我怎么就攤上這事∈钢蓿” “怎么了璧眠?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我责静,道長袁滥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任灾螃,我火速辦了婚禮题翻,結果婚禮上,老公的妹妹穿的比我還像新娘腰鬼。我一直安慰自己嵌赠,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布熄赡。 她就那樣靜靜地躺著姜挺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彼硫。 梳的紋絲不亂的頭發(fā)上初家,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音乌助,去河邊找鬼。 笑死陌知,一個胖子當著我的面吹牛他托,可吹牛的內容都是我干的。 我是一名探鬼主播仆葡,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赏参,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沿盅?” 一聲冷哼從身側響起把篓,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腰涧,沒想到半個月后韧掩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡窖铡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年疗锐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片费彼。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡滑臊,死狀恐怖,靈堂內的尸體忽然破棺而出箍铲,到底是詐尸還是另有隱情雇卷,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站关划,受9級特大地震影響小染,放射性物質發(fā)生泄漏。R本人自食惡果不足惜祭玉,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一氧映、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脱货,春花似錦岛都、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扣孟,卻和暖如春烫堤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凤价。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工鸽斟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人利诺。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓富蓄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慢逾。 傳聞我的和親對象是個殘疾皇子立倍,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容