Spring MVC 02

高级参数绑定

绑定数组

http://localhost:8080/springmvc-mybatis/item/itemlist.action

前端传来的ids是数组

<form action="${pageContext.request.contextPath }/deletes.action" method="post">
<table width="100%" border=1>
<tr>
    <td><input type="checkbox" name="ids" value=""></td>
    <td>商品名称</td>
    <td>商品价格</td>
    <td>生产日期</td>
    <td>商品描述</td>
    <td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item" varStatus="s">
<tr>
    <td><input type="checkbox" name="ids" value="${item.id }"></td>
    <td><input type="text" name="itemsList[${s.index}].name" value="${item.name }"></td>
    <td><input type="text" name="itemsList[${s.index }].price" value="${item.price }"></td>
    <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
    <td>${item.detail }</td>
    
    <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>
</table>
<input type="submit"  value="删除">

后端用数组属性接收

//删除多个
@RequestMapping(value = "/deletes.action")
public ModelAndView deletes(QueryVo vo){
    ModelAndView mav = new ModelAndView();
    mav.setViewName("success");
    return mav;
}

public class QueryVo {
    //商品
    private Items items;
    Integer[] ids;
    private List<Items> itemsList;

@RequestMapping注解

@RequestMapping(value = "/updates.action",method = {RequestMethod.POST,RequestMethod.GET})

method = {RequestMethod.POST,RequestMethod.GET}限定请求方式

value = "/updates.action"访问路径

如果value中的目录有多级,并且整个controller中的方法访问路径都在同一目录下,可以提取出来

放一个@RequestMapping(value = "/item")到类头上

多个url映射到同一个方法

@RequestMapping(value = {"/item/itemlist.action","/item/itemlisthaha.action"})
public String itemList(Model model,HttpServletRequest request,HttpServletResponse response) throws MessageException{
//        Integer i = 1/0;
    //从Mysql中查询
    List<Items> list = itemService.selectItemsList();
//        if(null == null){
//            throw new MessageException("商品信息不能为空");
//        }
    model.addAttribute("itemList", list);
    return "itemList";
}

controller方法返回值

/**
 * 1.ModelAndView  无敌的    带着数据  返回视图路径           不建议使用
 * 2.String    返回视图路径     model带数据      官方推荐此种方式   解耦   数据  视图  分离  MVC  建议使用  
 * 3.void       ajax  请求   合适   json格式数据 (response   异步请求使用
 */
@RequestMapping(value = {"/item/itemlist.action","/item/itemlisthaha.action"})
public String itemList(Model model,HttpServletRequest request,HttpServletResponse response) throws MessageException{
    //从Mysql中查询
    List<Items> list = itemService.selectItemsList();
//        if(null == null){
//            throw new MessageException("商品信息不能为空");
//        }
    model.addAttribute("itemList", list);
    return "itemList";
}

 重定向/转发

//提交修改页面 入参  为 Items对象  
@RequestMapping(value = "/updateitem.action")
//    public ModelAndView updateitem(Items items){
public String updateitem(QueryVo vo,MultipartFile pictureFile) throws Exception{

    //保存图片到 
    String name = UUID.randomUUID().toString().replaceAll("-", "");
    //jpg
    String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
    
    pictureFile.transferTo(new File("D:\\upload\\" + name + "." + ext));
    
    vo.getItems().setPic(name + "." + ext);
    //修改
    itemService.updateItemsById(vo.getItems());
    
//        ModelAndView mav = new ModelAndView();
//        mav.setViewName("success");
    return "redirect:/itemEdit.action?id=" + vo.getItems().getId();
//        return "forward:/item/itemlist.action";//转发有个问题,页面刷新会把刚才的提交动作再做一遍
} 

异常处理器(配置好后,出现异常会自动进入这个方法)

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

/**
 * 异常处理器的自定义的实现类
 */
public class CustomExceptionResolver implements HandlerExceptionResolver{

    public ModelAndView resolveException(HttpServletRequest request, 
            HttpServletResponse response, Object obj,
            Exception e) {
        // TODO Auto-generated method stub  发生异常的地方 Serivce层  方法  包名+类名+方法名(形参) 字符串
        //日志    1.发布 tomcat war  Eclipse  2.发布Tomcat  服务器上  Linux  Log4j
        
        ModelAndView mav = new ModelAndView();
        //判断异常为类型
        if(e instanceof MessageException){
            //预期异常
            MessageException me = (MessageException)e;
            mav.addObject("error", me.getMsg());
        }else{
            mav.addObject("error", "未知异常");
        }
        mav.setViewName("error");
        return mav;
    }

}

自定义异常

public class MessageException extends Exception{

    private String msg;

    public MessageException(String msg) {
        super();
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

交给spring管理

springmvc.xml

<!-- Springmvc的异常处理器 -->
<!-- <bean class="com.itheima.springmvc.exception.CustomExceptionResolver"/> -->

只改处理业务,不修改返回和请求相关的内容,不需要重启服务器(eclipse server)


上传图片

有一波操作

http://localhost:8080/pic/HD.jpg

<form id="itemForm" action="${pageContext.request.contextPath }/updateitem.action" method="post" enctype="multipart/form-data">

<td>商品图片</td>
<td>
    <c:if test="${item.pic !=null}">
        <img src="/pic/${item.pic}" width=100 height=100/>
        <br/>
    </c:if>
    <input type="file"  name="pictureFile"/> 
</td>

springmvc.xml

<!-- 上传图片配置实现类 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 上传图片的大小   B   5M  1*1024*1024*5-->
    <property name="maxUploadSize" value="5000000"/>
</bean>

ItemController.java

//提交修改页面 入参  为 Items对象
@RequestMapping(value = "/updateitem.action")
public String updateitem(QueryVo vo,MultipartFile pictureFile) throws Exception{

    //保存图片到 
    String name = UUID.randomUUID().toString().replaceAll("-", "");
    //jpg
    String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
    
    pictureFile.transferTo(new File("D:\\upload\\" + name + "." + ext));
    
    vo.getItems().setPic(name + "." + ext);
    //修改
    itemService.updateItemsById(vo.getItems());
    return "redirect:/itemEdit.action?id=" + vo.getItems().getId();
}

json数据交互

  • jackson-annotations-2.4.0.jar
  • jackson-core-2.4.2.jar
  • jackson-databind-2.4.2.jar
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(function(){
    var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';

    $.ajax({
        url : "${pageContext.request.contextPath }/json.action",
        data : params,
        contentType : "application/json;charset=UTF-8",//发送数据的格式
        type : "post",
        dataType : "json",//回调
        success : function(data){
            alert(data.name);
        }
    });
});
</script>

后台接收与返回

//json数据交互
@RequestMapping(value = "/json.action")
public @ResponseBody//返回 对象 转为 json
Items json(@RequestBody Items items){//接收 json 放到 对象
    
//        System.out.println(items);
    
    return items;
}

可用谷歌浏览器测试工具测试


restful

是一种风格,可以理解为极简主义,或者一个程序特别内敛特别妥帖,跟人交互特别之清新!

传统方式操作资源
http://127.0.0.1/item/queryItem.action?id=1	查询,GET
http://127.0.0.1/item/saveItem.action		新增,POST
http://127.0.0.1/item/updateItem.action		更新,POST
http://127.0.0.1/item/deleteItem.action?id=1	删除,GET或POST
使用RESTful操作资源
http://127.0.0.1/item/1		查询,GET
http://127.0.0.1/item		新增,POST
http://127.0.0.1/item		更新,PUT
http://127.0.0.1/item/1		删除,DELETE

让前台请求后台时链接极其简约

//RestFul风格的开发
@RequestMapping(value = "/itemEdit/{id}.action")
public ModelAndView toEdit1(@PathVariable Integer id,
        HttpServletRequest request,HttpServletResponse response
        ,HttpSession session,Model model){
    
}

拦截器配置

springmvc.xml中配置

<!-- SPringmvc的拦截器 -->
<mvc:interceptors>
    <!-- 多个拦截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <!-- 自定义的拦截器类 -->
        <bean class="com.itheima.springmvc.interceptor.Interceptor1"/>
    </mvc:interceptor>
<!--         <mvc:interceptor>
        <mvc:mapping path="/**"/>
        自定义的拦截器类
        <bean class="com.itheima.springmvc.interceptor.Interceptor2"/>
    </mvc:interceptor> -->
</mvc:interceptors>

拦截未登陆

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Interceptor1 implements HandlerInterceptor{

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        // 返回true就放行
        System.out.println("方法前 1");
        //判断用户是否登陆  如果没有登陆  重定向到登陆页面   不放行   如果登陆了  就放行了
        // URL  http://localhost:8080/springmvc-mybatis/login.action
        //URI /login.action
        String requestURI = request.getRequestURI();
        if(!requestURI.contains("/login")){//不拦截登陆
            String username = (String) request.getSession().getAttribute("USER_SESSION");
            if(null == username){
                response.sendRedirect(request.getContextPath() + "/login.action");
                return false;
            }
        }
        return true;
    }
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println("方法后 1");
        
    }
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println("页面渲染后 1");
    }
}

登陆

//去登陆的页面
@RequestMapping(value = "/login.action",method = RequestMethod.GET)
public String login(){
    return "login";
}
@RequestMapping(value = "/login.action",method = RequestMethod.POST)
public String login(String username
        ,HttpSession httpSession){
    httpSession.setAttribute("USER_SESSION", username);
    return "redirect:/item/itemlist.action";
}

 


 

 

 

 

 

 

posted @ 2020-05-23 13:33  夜雨秋池  阅读(150)  评论(0编辑  收藏  举报