SpringMVC次日

1      SpringMVC次日筆記

2      高級參數綁定

 

2.1    數組類型的參數綁定

基於批量刪除商品操做完成參數傳遞。html

 

Jsp修改java

 

 

控制器修改web

/**

     * 包裝pojo傳遞演示

     * 次日,演示數組參數的傳遞與List的傳遞

     * @param vo

     * @return

     */

    @RequestMapping("queryItem")

    public String queryItem(QueryVo vo, Integer[] ids) {

       System.out.println(vo);

       //輸出傳入的數組

       if (ids != null && ids.length > 0) {

           for (Integer id : ids) {

              System.out.println("傳入的商品列表分別爲:" + id);

           }

       }

 

       return "itemList";

    }

 

2.2    List類型的綁定

基於批量修改商品操做完成參數傳遞。spring

 

Jsp修改json

 

 

 

控制器修改數組

 

 

POJO修改瀏覽器

 

 

 

3      @RequestMapping註解的使用

3.1    路徑映射能夠是數組

 

 

 

3.2    @RequestMapping能夠加在類頭部,用於目錄分級管理

 

 

 

3.3    限定請求方法

 

 

 

 

4      Controller方法返回值

4.1    返回ModelAndView

參考第一天內容。session

 

4.2    返回void

4.2.1  request

 

 

 

新建msg.jspmvc

 

 

4.2.2  response

 

 

 

4.3    返回String

4.3.1  返回視圖名字,參考第一天內容

 

4.3.2  redirect與forward

 

 

 

 

 

5      Springmvc中異常處理

思想:作一個全局異常處理器,處理全部沒有處理過的運行時異經常使用於更友好地提示用戶。app

 

5.1    步驟

5.1.1  建立全局異常處理器

/**

 * 全局異常處理器

 * @author Steven

 *

 */

public class CustomerException implements HandlerExceptionResolver {

 

    @Override

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,

           Exception e) {

       //記錄日誌

       e.printStackTrace();

       //錯誤消息

       String msg = "很抱歉,系統發生異常了,請聯繫管理員";

      

       //響應用戶錯誤提示

       ModelAndView mav = new ModelAndView();

       //返回錯誤消息

       mav.addObject("msg", msg);

       //響應錯誤提示頁面

       mav.setViewName("msg");

       return mav;

    }

}

 

 

 

5.1.2  配置異常處理器

 

 

 

5.1.3  測試訪問queryVoid.action

 

 

 

5.1.4  更智能、更友好的提示,解決方案

5.1.4.1新建自定義異常類

/**

 * 自定義異常

 * @author Steven

 *

 */

public class MyException extends Exception {

   

    //錯誤消息

    private String msg;

 

    public MyException() {

       super();

    }

    public MyException(String msg) {

       super();

       this.msg = msg;

    }

    public String getMsg() {

       return msg;

    }

    public void setMsg(String msg) {

       this.msg = msg;

    }

}

 

 

5.1.4.2修改異常處理器,加上異常判斷

 

 

5.1.4.3測試訪問queryVoid.action

 

 

6      圖片上傳處理

6.1    配置虛擬目錄

 

 

6.2    加入上傳功能須要的jar包

 

 

6.3    配置多媒體解析器

<!-- 配置多媒體處理器 -->

    <!-- 注意:這裏id必須填寫:multipartResolver -->

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

       <!-- 最大上傳文件大小 -->

       <property name="maxUploadSize" value="8388608" />

    </bean>

 

6.4    jsp修改

 

 

6.5    編寫圖片上傳處理代碼

//圖片上傳用MultipartFile接收文件

    @RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET })

    public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception {

 

       // 圖片新名字

       String name = UUID.randomUUID().toString();

       // 圖片原名字

       String oldName = picFile.getOriginalFilename();

       // 後綴名

       String exeName = oldName.substring(oldName.lastIndexOf("."));

 

       File pic = new File("D:\\WebWork\\" + name + exeName);

       // 保存圖片到本地磁盤

       picFile.transferTo(pic);

       // 更新商品圖片信息

       item.setPic(name + exeName);

 

       itemServices.update(item);

       model.addAttribute("item", item);

       model.addAttribute("msg", "修改商品成功");

       return "itemEdit";

    }

 

7      json數據交互

7.1    加入jar包

 

 

 

 

7.2    編碼

/**

     * json數據交互演示

     *

     * @param item2

     * @return

     */

    @RequestMapping("getItem")

    //@ResponseBody把pojo轉成json串響應用戶

    @ResponseBody

    //@RequestBody用於接收用戶傳入json串轉成pojo

    public Item getItem(@RequestBody Item item2) {

 

       System.out.println("接收到的json商品數據爲:" + item2);

 

       Item item = itemServices.getItemById(3);

       return item;

    }

 

 

7.3    測試,安裝google瀏覽器測試工具

 

 

8      Springmvc實現Restful

8.1    編碼

/**

     * RESTful風格演示

     *

     * @param ids

     * @param model

     * @return

     */

    //RESTful風格url上的參數經過{}點位符綁定

    //點位符參數名與方法參數名不一致時,經過@PathVariable綁定

    @RequestMapping("/item/{id}")

    public String testRest(@PathVariable("id") Integer ids, Model model) {

       Item item = itemServices.getItemById(ids);

       model.addAttribute("item", item);

       return "itemEdit";

    }

 

8.2    測試

測試直接訪問url{http://localhost:8080/項目名/item/1.action}便可。

 

9      攔截器

9.1    攔截器開發流程

9.1.1  建立攔截器

9.1.1.1一號攔截器

/**

 * 自定義攔截器

 * @author Steven

 *

 */

public class MyInterceptor1 implements HandlerInterceptor {

 

    //在Controller方法執行後被執行

    //處理異常、記錄日誌

    @Override

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

           throws Exception {

       System.out.println("MyInterceptor1.afterCompletion.....");

    }

 

    //在Controller方法執行後,返回ModelAndView以前被執行

    //設置或者清理頁面共用參數等等

    @Override

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

           throws Exception {

       System.out.println("MyInterceptor1.postHandle.....");

    }

 

    //在Controller方法執行前被執行

    //登陸攔截、權限認證等等

    @Override

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

      

       System.out.println("MyInterceptor1.preHandle.....");

      

       //返回true放行,false攔截

       return true;

    }

 

}

 

 

9.1.1.2二號攔截器,複製一號,修改一下系統輸出消息

 

9.1.2  配置攔截器

<!-- 攔截器定義 -->

    <mvc:interceptors>

       <!-- 定義一個攔截器 -->

       <mvc:interceptor>

           <!-- path配置</**>攔截全部請求,包括二級以上目錄,</*>攔截全部請求,不包括二級以上目錄 -->

           <mvc:mapping path="/**"/>

           <bean class="com.itheima.springmvc.interceptor.MyInterceptor1" />

       </mvc:interceptor>

      

       <!-- 定義一個攔截器 -->

       <mvc:interceptor>

           <!-- path配置</**>攔截全部請求,包括二級以上目錄,</*>攔截全部請求,不包括二級以上目錄 -->

           <mvc:mapping path="/**"/>

           <bean class="com.itheima.springmvc.interceptor.MyInterceptor2" />

       </mvc:interceptor>

    </mvc:interceptors>

 

 

 

9.2    攔截器案例應用,登陸攔截器

9.2.1  思路

一、有一個登陸頁面,須要寫一個controller訪問頁面

二、登陸頁面有一提交表單的動做。須要在controller中處理。

a)       判斷用戶名密碼是否正確

b)       若是正確 想session中寫入用戶信息

c)        返回登陸成功,或者跳轉到商品列表

三、攔截器。

a)       攔截用戶請求,判斷用戶是否登陸

b)       若是用戶已經登陸。放行

c)        若是用戶未登陸,跳轉到登陸頁面。

 

9.2.2  login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>用戶登陸</title>

</head>

<body>

<form action="${pageContext.request.contextPath }/user/login.action">

用戶名:<input type="text" name="username" /><br>

密碼:<input type="password" name="password" /><br>

<input type="submit">

</form>

</body>

</html>

 

9.2.3  UserController

/**

 * 登陸攔截器

 * @author Steven

 *

 */

@Controller

@RequestMapping("user")

public class UserController {

   

    /**

     * 跳轉登陸頁面

     * @return

     */

    @RequestMapping("toLogin")

    public String toLogin(){

       return "login";

    }

   

    /**

     * 用戶登陸

     * @return

     */

    @RequestMapping("login")

    public String login(String username,String password,HttpSession session){

      

       String result = "login";

      

       //判定用戶是否容許登陸

       if(username != null){

           session.setAttribute("username", username);

           //登陸成功,跳轉商品列表

           result = "redirect:/itemList.action";

       }

       return result;

    }

}

 

 

9.2.4  LoginInterceptor攔截器編碼

這裏省略類聲名和其它兩個方法。

 

//處理執行前被執行

    //登陸攔截、權限驗證

   @Override

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

     

      Object attribute = request.getSession().getAttribute("username");

       if(attribute != null){

         //放行,執行處理器

         return true;

       }else{

           response.sendRedirect(request.getContextPath() + "/user/tologin.action");

         //放行,執行處理器

         return false;

       }

   }

 

9.2.5  攔截器配置

<!-- 登陸攔截器 -->

       <mvc:interceptor>

           <!-- path配置</**>攔截全部請求,包括二級以上目錄,</*>攔截全部請求,不包括二級以上目錄 -->

           <mvc:mapping path="/**"/>

           <!-- 配置不攔截請求的地址 -->

           <!-- <mvc:exclude-mapping path="/user/toLogin.action"/>

           <mvc:exclude-mapping path="/user/login.action"/> -->

           <mvc:exclude-mapping path="/user/*"/>

           <bean class="com.itheima.springmvc.interceptor.LoginInterceptor" />

       </mvc:interceptor>

 

 
相關文章
相關標籤/搜索