SpringMVC筆記(二)

一甫男、常用注解

1.@RequestParam

作用于參數(shù)上且改,用于提交參數(shù)與實(shí)際參數(shù)名稱不一致時(shí)候生效,即name為提交的時(shí)候的參數(shù)名字,但是綁定給了username板驳;

    @RequestMapping("/anno")
    public String action(@RequestParam(name="name") String username){
        System.out.println(username);
        return "success";
    }

2.@RequestBody

作用于參數(shù)又跛,獲取POST提交參數(shù)的請(qǐng)求體

    @RequestMapping("/anno")
    public String action(@RequestBody String body){
        System.out.println(body);
        return "success";
    }

3.@PathVariable

作用于參數(shù),restful風(fēng)格獲取參數(shù),將請(qǐng)求路徑中的{id}封裝到方法參數(shù)中

@RequestMapping("/path/{sid}")
    public String path(@PathVariable(name="sid") String id){
        System.out.println(id);
        return "success";
    }

請(qǐng)求路徑:http://localhost:8080/path/10
控制臺(tái)打印10若治;

4.@RequestHeader

作用于參數(shù)慨蓝,獲取請(qǐng)求頭參數(shù)

 @RequestMapping("/anno/header")
    public String header(@RequestHeader("Cookies") String cookies){
        System.out.println(cookies);
        return "success";
    }

5.@CookieValue

作用于參數(shù),獲取Cookies端幼,根據(jù)鍵獲取值
獲取cookie中username的值

 @RequestMapping("/anno/header")
    public String header(@CookieValue("username") String username){
        System.out.println(username);
        return "success";
    }

6.@ModelAttribute

作用于參數(shù)和方法菌仁,在方法上加上該注解澤優(yōu)先于請(qǐng)求的controller方法執(zhí)行
用處:在用戶提交參數(shù)不完整的情況下,可以使用該注解來(lái)添加提交參數(shù)

 @RequestMapping("/anno/modelAttr")
    public String modelAttr(@ModelAttribute("attr")User user){
        System.out.println(user);
        return "success";
    }
    @ModelAttribute
    public void attrPre(Map<String,User> map){
        User user=new User();
        user.setUsername("222");
        user.setPassword("123");
        map.put("attr",user);
    }

這樣即使即使沒(méi)有提交username静暂,password也會(huì)使用@modelAttribute方法中對(duì)應(yīng)的map的user值济丘;

7.@SessionAttributes

作用于類,用于向session域里存值

@Controller
@SessionAttributes("msg")
public class HelloController {
    @RequestMapping("/anno/sessionAttr")
    public String sessionAttr(ModelMap modelMap, SessionStatus sessionStatus){
        //添加
        modelMap.addAttribute("msg","hello sessionAttrbutes");
        //獲取
        modelMap.get("msg");
        //刪除
        sessionStatus.setComplete();
        return "success";
    }
}

二洽蛀、響應(yīng)數(shù)據(jù)和結(jié)果視圖

1.返回值分類

1.1 String類型

Controller方法返回字符串可以指定邏輯視圖的名稱摹迷,根據(jù)視圖解析器為物理視圖的地址。

  @RequestMapping(value="/hello")
  public String sayHello() {
      System.out.println("Hello SpringMVC!!");
      // 跳轉(zhuǎn)到XX頁(yè)面
      return "success";
  }
1.2 void類型
  1. 如果控制器的方法返回值編寫(xiě)成void郊供,執(zhí)行程序報(bào)404的異常峡碉,默認(rèn)查找JSP頁(yè)面沒(méi)有找到。在注解@RequestMapping(value="/hello") 下驮审,默認(rèn)會(huì)跳轉(zhuǎn)到hello的頁(yè)面鲫寄,相當(dāng)于返回string為hello。
  2. 可以使用請(qǐng)求轉(zhuǎn)發(fā)或者重定向跳轉(zhuǎn)到指定的頁(yè)面
  @RequestMapping(value="/init")
    public void initAdd(HttpServletRequest request,HttpServletResponse response) throws 
Exception {
        System.out.println("請(qǐng)求轉(zhuǎn)發(fā)或者重定向");
        // 請(qǐng)求轉(zhuǎn)發(fā)
         request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, 
response);
        // 重定向
         response.sendRedirect(request.getContextPath()+"/success.jsp");
        
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        // 直接響應(yīng)數(shù)據(jù)
        response.getWriter().print("hello mvc");
        return;
    }
3.ModelAndView類型
  1. ModelAndView對(duì)象是Spring提供的一個(gè)對(duì)象疯淫,可以用來(lái)調(diào)整具體的JSP視圖
  2. 具體的代碼如下
   /**
     * 返回ModelAndView對(duì)象
     * 可以傳入視圖的名稱(即跳轉(zhuǎn)的頁(yè)面)地来,還可以傳入對(duì)象。
     */
    @RequestMapping(value="/findAll")
    public ModelAndView findAll() throws Exception {
        ModelAndView mv = new ModelAndView();
        // 跳轉(zhuǎn)到list.jsp的頁(yè)面
        mv.setViewName("list");
        
        // 模擬從數(shù)據(jù)庫(kù)中查詢所有的用戶信息
        List<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setUsername("張三");
        user1.setPassword("123");
        
        User user2 = new User();
        user2.setUsername("趙四");
        user2.setPassword("456");
                
        users.add(user1);
        users.add(user2);
        // 添加對(duì)象
        mv.addObject("users", users);
        
        return mv;
    }

2.SpringMVC框架提供的轉(zhuǎn)發(fā)和重定向

controller方法返回String類型

2.1 forward轉(zhuǎn)發(fā)
public String testVoid() throws Exception {
        return "forward:/WEB_INF/jsp/success.jsp";
    }
2.2 redirect 重定向
public String testVoid() throws Exception {
        return "redirect:/index.jsp";
    }

3.ResponseBody響應(yīng)json數(shù)據(jù)

3.1. 配置靜態(tài)資源不攔截

DispatcherServlet會(huì)攔截到所有的資源熙掺,導(dǎo)致一個(gè)問(wèn)題就是靜態(tài)資源(img未斑、css、js)也會(huì)被攔截到币绩,從而
不能被使用蜡秽。解決問(wèn)題就是需要配置靜態(tài)資源不進(jìn)行攔截府阀,在springmvc.xml配置文件添加如下配置

  • mvc:resources標(biāo)簽配置不過(guò)濾
  • location元素表示webapp目錄下的包下的所有文件
  • mapping元素表示以/static開(kāi)頭的所有請(qǐng)求路徑,如/static/a 或者/static/a/b
      <!-- 設(shè)置靜態(tài)資源不過(guò)濾 -->
    <mvc:resources location="/css/" mapping="/css/**"/>  <!-- 樣式 -->
    <mvc:resources location="/images/" mapping="/images/**"/>  <!-- 圖片 -->
    <mvc:resources location="/js/" mapping="/js/**"/>  <!-- javascript -->
3.2.使用@RequestBody獲取請(qǐng)求體數(shù)據(jù),@ResponseBody將結(jié)果解析成json

3.2.1導(dǎo)入需要的jar包

  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

3.2.2 controller類
控制太打印post請(qǐng)求提交的數(shù)據(jù)芽突,并且返回把User對(duì)象解析成json字符串返回

 @RequestMapping("/testbody")
    public @ResponseBody User testVoid(@RequestBody User body) throws Exception {
        System.out.println(body);
        return body;
    }

3.2.3 ajax提交

$(function () {
            $("#btn").click(function () {
                $.ajax({
                    url:"/mvc/testbody",
                    contentType:"application/json;charset=utf8",
                    data:'{"username":"unclez","password":"zhg99524"}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
                        alert(data.username);
                    }
                });
            });
        });

三试浙、文件上傳

1.傳統(tǒng)方式

1.1 controller方法
 @RequestMapping("/file")
    public String fileupload1(HttpServletRequest request) throws Exception {
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        // 判斷路徑是否存在,如果不存在寞蚌,創(chuàng)建該路徑
        if(!file.exists()) {
            file.mkdirs();
        }
        DiskFileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload sf=new ServletFileUpload(factory);
        List<FileItem> items = sf.parseRequest(request);
        for(FileItem item:items){
            if(!item.isFormField()){
                String name=item.getName();
                File f=new File(path,name);
                item.write(f);
                item.delete();
            }
        }
        return "success";
    }
1.2 表單
<form action="/mvc/file" method="post" enctype="multipart/form-data">
    名稱:<input type="text" name="picname"/><br/>
    圖片:<input type="file" name="upload"/><br/>
    <input type="submit" value="上傳"/>
</form>

2.SpringMVC本服務(wù)器方式

2.1 配置文件解析器對(duì)象
    <!-- 配置文件解析器對(duì)象田巴,要求id名稱必須是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
    </bean>
2.1 controller類
@RequestMapping("/file")
    public String fileupload1(HttpServletRequest request,MultipartFile upload) throws Exception {
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        // 判斷路徑是否存在,如果不存在睬澡,創(chuàng)建該路徑
        if(!file.exists()) {
            file.mkdirs();
        }
        String filename = upload.getOriginalFilename();
        filename=UUID.randomUUID()+"_"+filename;
        upload.transferTo(new File(path,filename));
        return "success";
    }

3.SpringMVC分其他服務(wù)器上傳

3.1 jar包
 <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>
3.2 控制器
@RequestMapping("/file2")
    public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception {
        String server_path="遠(yuǎn)程服務(wù)器地址";
        String filename = upload.getOriginalFilename();
        Client client=Client.create();
        WebResource resource = client.resource(server_path + filename);
        resource.put(upload.getBytes());
        return "success";
    }

四、異常處理

1. 異常處理思路

Controller調(diào)用service眠蚂,service調(diào)用dao煞聪,異常都是向上拋出的,最終有DispatcherServlet找異常處理器進(jìn)行異常的處理逝慧。比如統(tǒng)一跳轉(zhuǎn)404.html之類的

2.自定義異常類

public class MyException extends Exception {
    // 異常提示信息
    private String message;
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public MyException(String message) {
        this.message = message;
    }

}

3.自定義異常處理器

public class MyExecptionResolver implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mv=new ModelAndView();
        if (ex instanceof MyException)
        {
            mv.addObject("errorMsg",ex.getMessage());
        }else {
            //do something..
        }
        mv.setViewName("404");
        return mv;
    }
}

4.配置異常類

<bean id="myExecptionResolver" class="com.unclezs.resolver.MyExecptionResolver"/>

五昔脯、攔截器

1.概述

  1. SpringMVC框架中的攔截器用于對(duì)處理器進(jìn)行預(yù)處理和后處理的技術(shù)。
  2. 可以定義攔截器鏈笛臣,連接器鏈就是將攔截器按著一定的順序結(jié)成一條鏈云稚,在訪問(wèn)被攔截的方法時(shí),攔截器鏈中的攔截器會(huì)按著定義的順序執(zhí)行沈堡。
  3. 攔截器和過(guò)濾器的功能比較類似静陈,有區(qū)別
    1. 過(guò)濾器是Servlet規(guī)范的一部分,任何框架都可以使用過(guò)濾器技術(shù)诞丽。
    2. 攔截器是SpringMVC框架獨(dú)有的鲸拥。
    3. 過(guò)濾器配置了/*,可以攔截任何資源僧免。
    4. 攔截器只會(huì)對(duì)控制器中的方法進(jìn)行攔截刑赶。
  4. 攔截器也是AOP思想的一種實(shí)現(xiàn)方式
  5. 想要自定義攔截器,需要實(shí)現(xiàn)HandlerInterceptor接口懂衩。

2. 自定義攔截器步驟

創(chuàng)建類撞叨,實(shí)現(xiàn)HandlerInterceptor接口,重寫(xiě)需要的方法

3. HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法執(zhí)行前攔截的方法
    1. 可以使用request或者response跳轉(zhuǎn)到指定的頁(yè)面
    2. return true放行浊洞,執(zhí)行下一個(gè)攔截器牵敷,如果沒(méi)有攔截器,執(zhí)行controller中的方法法希。
    3. return false不放行劣领,不會(huì)執(zhí)行controller中的方法。
  2. postHandle是controller方法執(zhí)行后執(zhí)行的方法铁材,在JSP視圖執(zhí)行前尖淘。
    1. 可以使用request或者response跳轉(zhuǎn)到指定的頁(yè)面
    2. 如果指定了跳轉(zhuǎn)的頁(yè)面奕锌,那么controller方法跳轉(zhuǎn)的頁(yè)面將不會(huì)顯示。
  3. afterHandle方法是在JSP執(zhí)行后執(zhí)行
    1. request或者response不能再跳轉(zhuǎn)頁(yè)面了

4.配置多個(gè)攔截器

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <!-- 哪些方法不進(jìn)行攔截 -->
            <!--<mvc:exclude-mapping path="/user/*"/>-->
            <bean class="com.unclezs.interceptor.MyInterceptor"/>
       </mvc:interceptor>
       <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <bean class="com.unclezs.interceptor.MyInterceptor2"/>
       </mvc:interceptor>
   </mvc:interceptors>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末村生,一起剝皮案震驚了整個(gè)濱河市惊暴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趁桃,老刑警劉巖辽话,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卫病,居然都是意外死亡油啤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蟀苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)益咬,“玉大人,你說(shuō)我怎么就攤上這事帜平∮母妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵裆甩,是天一觀的道長(zhǎng)冗锁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嗤栓,這世上最難降的妖魔是什么冻河? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮茉帅,結(jié)果婚禮上芋绸,老公的妹妹穿的比我還像新娘。我一直安慰自己担敌,他們只是感情好摔敛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著全封,像睡著了一般马昙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刹悴,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天行楞,我揣著相機(jī)與錄音,去河邊找鬼土匀。 笑死子房,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播证杭,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼田度,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了解愤?” 一聲冷哼從身側(cè)響起镇饺,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎送讲,沒(méi)想到半個(gè)月后奸笤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼鬓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年监右,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片异希。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡健盒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宠互,到底是詐尸還是另有隱情味榛,我是刑警寧澤椭坚,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布予跌,位于F島的核電站,受9級(jí)特大地震影響善茎,放射性物質(zhì)發(fā)生泄漏券册。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一垂涯、第九天 我趴在偏房一處隱蔽的房頂上張望烁焙。 院中可真熱鬧,春花似錦耕赘、人聲如沸骄蝇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)九火。三九已至,卻和暖如春册招,著一層夾襖步出監(jiān)牢的瞬間岔激,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工是掰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虑鼎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炫彩,于是被迫代替她去往敵國(guó)和親匾七。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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

  • 對(duì)于java中的思考的方向媒楼,1必須要看前端的頁(yè)面乐尊,對(duì)于前端的頁(yè)面基本的邏輯,如果能理解最好划址,不理解也要知道幾點(diǎn)扔嵌。 ...
    神尤魯?shù)婪?/span>閱讀 806評(píng)論 0 0
  • SpringMVC介紹 Spring web mvc 和Struts2都屬于表現(xiàn)層的框架,它是Spring框架的一...
    day_Sunny閱讀 745評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,092評(píng)論 1 32
  • 凌晨3:30,聽(tīng)時(shí)間噠噠前行世澜。濃稠的黑幕里独旷,秒針上的熒光顫顫悠悠,一點(diǎn)一點(diǎn)爬出一條弧線寥裂。 打開(kāi)床頭燈嵌洼,藍(lán)色的香薰?fàn)t...
    繹如閱讀 461評(píng)論 6 2
  • 今天是我第五次聽(tīng)《炒股的智慧》一書(shū)了。昨天大勢(shì)的跌幅讓我開(kāi)始反思封恰,我的策略確實(shí)就像是個(gè)新手麻养!關(guān)鍵是到昨天為止我還不...
    道二十三閱讀 97評(píng)論 0 0