SprinMVC-高级参数绑定、@RequestMapping注解、Controller方法返回等
来源:互联网 发布:网络社交平台的特点 编辑:程序博客网 时间:2024/06/05 17:32
高级参数绑定
QueryVo对象:
public class QueryVo {private Item item;private Integer[] ids;//数组的传参private List<Item> itemList;//集合的传参
1、绑定数组
<c:forEach items="${itemList }" var="item" varStatus="vs"><tr><td><input type="checkbox" name="ids" value="${item.id } ">jsp页面中使用checkbox,
controller形参:
@RequestMapping(value="/queryitem",method=RequestMethod.POST)public String queryItem(QueryVo queryVo, Integer[] ids) {此时,当从页面跳转到controller时,就会将value值传入,ids数组和queryvo的属性ids。
2、表单数据绑定到list集合中
JSP中使用name属性如下:必须是POJO包装对象的list属性 + 索引角标 + 实体属性
<c:forEach items="${itemList }" var="item" varStatus="vs"><tr><td><input type="checkbox" name="ids" value="${item.id } "><input type="hidden" name="itemList[${vs.index }].id" value="${item.id }"></td><td><input name="itemList[${vs.index }].name" value="${item.name }"></td><td><input name="itemList[${vs.index }].price" value="${item.price }"></td><td><input name="itemList[${vs.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"></td><td><input name="itemList[${vs.index }].detail" value="${item.detail }"></td><td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td></tr></c:forEach>
而在controller中必须使用POJO包装对象的属性接收:@RequestMapping(value="/queryitem",method=RequestMethod.POST)public String queryItem(QueryVo queryVo, Integer[] ids) {
此时,表单数据传入queryvo的list属性中。@RequestMapping注解
1、URL路径映射:
@RequestMapping(value={"/itemList","itemlist","list"})public ModelAndView itemList() {value值是数组,可以将多个url映射到同一方法,如果不指定属性默认就是value属性。
2、窄化请求映射
在class上添加@RequestMapping( url ) 指定通用请求前缀,限制此类下所有方法请求url,必须以此请求前缀开头,通过此方法对url进行分类管理。
@Controller@RequestMapping("/item")public class ItemController {@RequestMapping(value="/queryitem",method=RequestMethod.POST)public String queryItem(QueryVo queryVo, Integer[] ids) {此时方法访问地址:/item/queryitem
3、请求方法限定
通过@RequestMapping限定请求方法
@RequestMapping(value="/queryitem",method=RequestMethod.POST)public String queryItem(QueryVo queryVo, Integer[] ids) {
限定此方法只能通过POST请求访问,其他访问会404;如果不指定此属性,可以是任意请求方法Controller方法返回
1、返回ModelAndView
……
2、返回void
在controller方法形参上指定request和response,使用request和response指定响应结果。
1)转发
request.getRequestDispatcher("页面路径").forward(request, response);
2)重定向
response.sendRedirect("重定向的url");
3)response响应
response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");response.getWriter().write("JSON的字符串");
3、返回字符串
1)逻辑视图名
Stirng代表逻辑视图名,模型部分使用Model对象
2)Redirect重定向
url重定向,两次请求:
@RequestMapping("/updateitem")public String updateitem(Item item){itemService.updateItems(item);return "redirect:/item/list";}
如果要传参数,可以:return " /item/list?...&... "
3)Forward转发
请求转发,一次请求:
@RequestMapping("/updateitem")public String updateitem(Item item){itemService.updateItems(item);return "forward:queryitem";}
转发前的参数在转发后仍然可以读取到,因为request和response共用。SpringMVC异常处理
SpringMVC中的异常出现都通过throws Exception向上抛出,最后由前端控制器交给异常处理器进行异常的处理。
全局异常处理器配置多个,但只有一个生效。
1、自定义异常处理器:实现HandlerExceptionResolver接口
public class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler,Exception e) {e.printStackTrace();// 取出错误栈StringWriter out = new StringWriter();PrintWriter printWriter = new PrintWriter(out);e.printStackTrace(printWriter);ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("message", out.toString());modelAndView.setViewName("error");return modelAndView;}2、在springmvc.xml中配置全局异常处理器:
<!-- 异常处理器配置 --><bean class="cn.ssm.springmvc.exception.GlobalExceptionResolver" />
图片上传
1、配置虚拟目录
指定上传的图片存放位置:
eclipse的servers视图,双击tomcat服务器,在Modules中,Add External Web Modul……
2、导入jar包
commons-fileupload /io 包
3、配置解析器:
<!-- 文件上传 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置上传文件的最大大小 5MB --><property name="maxUploadSize"><value>5242880</value></property></bean>
4、controller方法形参中添加一个参数接收文件,类型MultipartFile,参数名称和input的name属性一致。
( 页面表单enctype属性、input标签 ),controller业务:接收文件并保存,将文件写入磁盘:
@RequestMapping("/updateitem")public String updateitem(Item item,MultipartFile pictureFile) throws IllegalStateException, IOException{// 生成新的文件名并保存。String originalFilename = pictureFile.getOriginalFilename();String extName = originalFilename.substring(originalFilename.lastIndexOf("."));String fileName = UUID.randomUUID().toString() + extName;item.setPic(fileName);itemService.updateItems(item);//文件写入磁盘pictureFile.transferTo(new File("F:/upload/pic/" + fileName));return "forward:list";}
JSON数据交互
springmvc中默认使用的是Jackson,把对象和json相互转化的一个工具包。
1、导入Jackson的jar包。
2、在方法上添加@ResponseBody
返回对象时,会将Java对象转化成json响应浏览器。
返回字符串,相当于调用response的write方法。
3、在参数前添加@RequestBody注解,将提交的json数据转换成java对象。
@RequestMapping("/info")@ResponseBodypublic Item itemInfo(@RequestBody Item item){Item item1 = itemService.getItemById(item.getId());return item1;}使用ajax提交:
$.ajax({url:"${pageContext.request.contextPath }/item/info",type:"post",data:"{'id':1,'name':'123'}",contentType:"application/json;charset=utf-8",success:function(data) {alert(data);}});
SpringMVC实现Restful
Restful是一个资源定位及资源操作的风格,是对http协议的诠释。
资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。
如:http://blog.csdn.net/lllllishi/article/details/70504658
资源操作:put、delete、post、get方式。
url中没有参数,参数是url的一部分,需要从url中取参数。
@RequestMapping(value="/itemEdit/{id}")public String itemEdit(@PathVariable("id") Integer id, Model model) {Item item = itemService.getItemById(id);model.addAttribute("item", item);return "editItem";}
如果id和形参名称一样,@PathVariable不用指定名称。但:DispatcherServlet中 url 的设置 " / "拦截形式会拦截静态资源,需要做静态资源映射。
<!-- 资源映射 --><mvc:resources location="/WEB-INF/js/" mapping="/js/**" />
SpringMVC自定义拦截器
SpringMVC的拦截器,类似于Servlet中的Filter,对处理器进行前处理和后处理。
1、自定义登录拦截器:实现HandlerInterceptor接口
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler) throws Exception {
<!-- 拦截器配置 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.ssm.springmvc.interceptor.HandlerInterceptor1"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.ssm.springmvc.interceptor.LoginInterceptor"/></mvc:interceptor></mvc:interceptors>针对所有mapping配置全局拦截器。多个拦截器顺序执行。
3、拦截器简单实现:
@Overridepublic boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler) throws Exception {//判断是否为登录的urlString url = request.getRequestURL().toString();if(url.contains("/login") || url.contains("/dologin")){return true;}// 1)判断是否为登录状态。判断Session中是否有用户信息。HttpSession session = request.getSession();Object user = session.getAttribute("user");// 2)如果Session中没有用户信息,跳转到登录页面。拦截。if(user == null){response.sendRedirect(request.getContextPath() + "/login");return false;}// 3)如果Session中有用户信息放行。return true;}
4、LoginController简单实现:
@Controllerpublic class LoginController {@RequestMapping("/login")public String showLogin(){return "login";}@RequestMapping(value="/dologin",method=RequestMethod.POST)public String doLogin(String username , String pwd,HttpSession session){if("zhangsan".equals(username) && "123".equals(pwd)){session.setAttribute("user", username);return "redirect:/item/list";}return "redirect:/login";}
待续……
0 0
- SprinMVC-高级参数绑定、@RequestMapping注解、Controller方法返回等
- 【SpringMVC整合MyBatis】RequestMapping注解与controller方法返回值
- springmvc之@Controller、@RequestMapping等注解讲解
- SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解
- @RequestMapping注解方法返回值意义
- 注解形式Controller方法参数
- Spring注解@Controller @RequestMapping详解
- SpringMVC注解...@controller和@RequestMapping
- 使用@RequestMapping 定义处理器函数-通过@RequestParam元注解来将请求参数绑定到方法形参
- @RequestMapping注解的参数
- Spring mvc中Controller参数绑定注解详解
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam
- Lumen artisan vendor不能执行问题,已解决
- 最快让你上手ReactiveCocoa之基础篇
- Ajax之同步请求和异步请求的区别
- 让UITableView的section header view不悬停的方法
- Mac安装Meld,并使用Meld作为git merge tool的工具
- SprinMVC-高级参数绑定、@RequestMapping注解、Controller方法返回等
- redis安装(centos源码包安装)
- 视图
- 跟我学JavaScript--类型转换
- c语言函数sscanf()和sprintf()
- 视图
- 读取指定文件夹下所有文件并保存
- 关于Mysql入库时间的问题
- 流媒体基础总结