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

注:如果直接使用Request对象的话,是不走视图解析器的,需要给jsp的全路径
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 {

2、在springmvc.xml中配置:
<!-- 拦截器配置 --><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
原创粉丝点击