SpringMVC開發(fā)流程

要點(diǎn)

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

1.SpringMVC簡介

SpringMVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow里面。Spring 框架提供了構(gòu)建 Web 應(yīng)用程序的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構(gòu),從而在使用Spring進(jìn)行WEB開發(fā)時(shí),可以選擇使用Spring的SpringMVC框架或集成其他MVC開發(fā)框架,如Struts1,Struts2等,在這里暫時(shí)就不分析SpringMVC與Struts2的比較了.

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

需要的jar包(需要什么包添加什么包就不一下全部添加進(jìn)去了 )
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以下的對(duì)el表達(dá)式不是很智能,需要配置isELIgnored="false"
配置前端控制器

 <!--前端控制器/請(qǐng)求分發(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>
    <!--設(shè)置優(yōu)先級(jí)-->
    <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類,實(shí)現(xiàn)Controller接口.復(fù)寫handleRequest方法

public class HelloWorldController implements Controller {

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

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

 <!--name請(qǐng)求的映射路徑 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

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

 <!--設(shè)置優(yōu)先級(jí)-->
 <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 {
    //方法中需要什么對(duì)象就寫到形參上
    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ū)別
/: 會(huì)匹配到url路徑(/index),靜態(tài)資源(
.html,.js等),但是不會(huì)匹配到.jsp
/: 會(huì)匹配到url路徑(/index),靜態(tài)資源(.html,.js等),也會(huì)匹配到.jsp

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

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

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

圖片.png

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

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

5.前臺(tái)往后臺(tái)傳參的方式

@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.使用對(duì)象的方式

  @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)

<!--編碼過濾器 只對(duì)post請(qǐng)求有效-->
<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.后臺(tái)往前臺(tái)傳值

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

//2.使用ModelAndView對(duì)象
@RequestMapping("value1")
public ModelAndView value() throws Exception {
    ModelAndView mv = new ModelAndView();
    //設(shè)置屬性
    mv.addObject("name", "CoderZS");
    mv.addObject("password", "123");
    User user = new User("zhangsan", "1234");
    mv.addObject("user", user);
    //mv.addObject(user);
    mv.addObject("maYun");//設(shè)置默認(rèn)key為當(dāng)前對(duì)象類型(小寫開頭)
    mv.addObject("hahaha");//后面設(shè)置相同類型的值會(huì)覆蓋之前的值

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

    //設(shè)置視圖
    mv.setViewName("/hello.jsp");
    return mv;
}

//3.直接返回對(duì)象
//此時(shí)會(huì)尋找視圖解析器中[前綴+value2+后綴]的頁面/WEB-INF/views/value2.jsp
@RequestMapping("/value2")
public User getUser() {
    return new User("CoderZS", "1234");
}

//注意返回String的時(shí)候會(huì)當(dāng)做視圖解析(推薦使用)
//如果返回的類型是String就會(huì)把返回值當(dāng)做使徒的一部分
//最終去尋找的路徑[前綴+返回的值+后綴]
//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 //請(qǐng)求轉(zhuǎn)發(fā)
    return "redirect:login.html";//重定向
}
}

8.文件上傳

表單.png
 //文件上傳
@RequestMapping("/upload")
//  在方法形參上添加MultipartFile對(duì)象來接收(不能使用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);
    //關(guān)閉輸出流
    outputStream.close();
}
圖片.png

添加文件上傳解析器

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

9.文件下載

   //文件下載
@RequestMapping("/download")
public  void download(HttpServletResponse response) throws Exception {
    System.out.println("---下載-----");
    //設(shè)置下載響應(yīng)頭
    response.setHeader("Content-Disposition","attachment;filename=a.jpg");
    //讀取文件
    FileInputStream inputStream=new FileInputStream("/Users/zhangshuai/Desktop/file/1.jpg");
    IOUtils.copy(inputStream, response.getOutputStream());
    //關(guān)閉輸入流
    inputStream.close();
}
圖片.png

10.注冊(cè)攔截器

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

2.注冊(cè)攔截器

 <!--注冊(cè)攔截器-->
<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");
    //轉(zhuǎn)成json字符串的工具
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);
    System.out.println(json);
}
}

12.日期處理

后臺(tái)往前臺(tái)傳json值時(shí)(包含日期)

默認(rèn)輸出的是毫秒值,需要使用特定的格式

解決方案:
方案1:在屬性上添加@JsonFormat注解,注意要添加時(shí)區(qū)

圖片.png

方案2: 在總配置文件添加相關(guān)配置

  <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>
前臺(tái)往后臺(tái)傳參時(shí)(包含日期)

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));
}

如果兩種都有,會(huì)使用initBinder方法

13.圖解SpringMVC執(zhí)行流程

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評(píng)論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,873評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,846評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,025評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,279評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評(píng)論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,751評(píng)論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,016評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容