springmvc快速回顾02

springmvc02
1、高级参数绑定
a)数组类型的参数绑定
b)List类型的绑定
2、@RequestMapping注解的使用
3、Controller方法返回值
4、Springmvc中异常处理
5、图片上传处理
6、Json数据交互
7、Springmvc实现RESTful
8、拦截器

一.
《数组类型的参数绑定》
可以在类中定义一个数组,使用类来接受,queryVo
可以直接在参数上使用数组类型进行接受,ids
@RequestMapping(“queryItem”)
public String queryItem(QueryVo queryVo, Integer[] ids) {}

集合接受,只能在类中定义一个List,使用类来接受,springmvc不能直接在参数上定义List接受
但是可以定义map
jsp中,集合传递可以使用forEach标签中的varAtatus:
<c:forEach items="KaTeX parse error: Expected 'EOF', got '}' at position 42: …” varStatus="s"}̲ td><input typ…{s.index}]" value=“自定义名称.属性”>

// 返回页面的数据中有中文,用produces 处理乱码
@RequestMapping(value = “/getUsers”, produces = { “text/html;charset=UTF-8” }, method = RequestMethod.GET)
@ResponseBody
public String getUsers(HttpServletRequest request,
@RequestParam Map<String, String> params1) {}

二.
《@RequestMapping》
@RequestMapping 处理器映射路径,可以将url映射到同一个方法上
可以支持多url映射
@RequestMapping(value = { “itemList”, “itemListAll” })
public ModelAndView queryItemList() {

也可以添加在类上面,限制此类下的所有方法请求url必须以请求前缀开头
@RequestMapping(“item”)
public class ItemController {

《请求方法的限定》
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过POST访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported

例如:
@RequestMapping(value = “itemList”,method = RequestMethod.POST)

限定POST方法
@RequestMapping(method = RequestMethod.POST)

如果通过GET访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported

GET和POST都可以
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

三.
《controller方法返回值》
《返回ModelAndView》
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view
上一篇文章有对ModelAandView的详解

《返回void》
在Controller方法形参上可以定义request和response,使用request或response指定响应结果
1、使用request转发页面,如下:
request.getRequestDispatcher(“页面路径”).forward(request, response);
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

2、可以通过response页面重定向:
response.sendRedirect(“url”)
response.sendRedirect("/springmvc-web2/itemEdit.action");

3、可以通过response指定响应结果,例如响应json数据如下:
response.getWriter().print("{“abc”:123}");

《返回字符串》
1.controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp
return “itemList”;
上一篇文章有详细说明

《Redirect重定向》
Contrller方法返回字符串可以重定向到一个url地址
如下商品修改提交后重定向到商品编辑页面。
// 重定向后浏览器地址栏变更为重定向的地址,
// 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
// 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
return “redirect:/itemEdit.action?itemId=” + item.getId();

《forward转发》
Controller方法执行后继续执行另一个Controller方法
// 修改商品成功后,继续执行另一个方法
// 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
// 转发并没有执行新的request和response,所以之前的请求参数都存在
return “forward:/itemEdit.action”;

四.
《异常处理思路》
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throwsException向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
就是在运行代码某一个环境出现异常后,异常向上抛,抛到前端控制器的时候,因为我们配置了异常处理器,前端控制器就会将该异常进行拦截,并交给我们定义的异常处理器进行处理

自定义异常类
为了区别不同的异常,通常根据异常类型进行区分,这里我们创建一个自定义系统异常。
如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

自定义异常类:
public class MyException extends Exception {
// 异常信息
private String message;
public MyException() {
super();
}
public MyException(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

自定义异常处理器:
obj是发生异常的地方 层,包名+类名+方法名(形参) 的字符串
public class CustomHandleException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
// 定义异常信息
String msg;
// 判断异常类型
if (exception instanceof MyException) {
// 如果是自定义异常,读取异常信息
msg = exception.getMessage();
} else {
// 如果是运行时异常,则取错 误堆栈,从堆栈中获取异常信息
Writer out = new StringWriter();
PrintWriter s = new PrintWriter(out);
exception.printStackTrace(s);
msg = out.toString();
}
// 把错误信息发给相关人员,邮件,短信等方式
// TODO
// 返回错误页面,给用户友好页面显示错误信息
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject(“msg”, msg);
modelAndView.setViewName(“error”);
return modelAndView;
}
}

异常处理器配置
<! – 配置全局异常处理器 -->

错误页面
<%@ 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>Insert title here
< /head>
< body>
< h1>系统发生异常了!
< br />
< h1>异常信息
< br />
< h2>${msg }
< /body>
< /html>

异常测试
/**

  • 查询商品列表
  • @return
  • @throws Exception
    */
    @RequestMapping(value = { “itemList”, “itemListAll” })
    public ModelAndView queryItemList() throws Exception {
    // 自定义异常
    if (true) {
    throw new MyException(“自定义异常出现了~”);
    }
    // 运行时异常
    int a = 1 / 0;
    // 查询商品数据
    List list = this.itemService.queryItemList();
    // 创建ModelAndView,设置逻辑视图名
    ModelAndView mv = new ModelAndView(“itemList”);
    // 把商品数据放到模型中
    mv.addObject(“itemList”, list);
    return mv;
    }

五.
配置上传解析器
< !-- 文件上传,id必须设置为multipartResolver -->
< bean id=“multipartResolver”
class=“org.springframework.web.multipart.commons.CommonsMultipartResolver”>
< !-- 设置文件上传大小 -->
< property name=“maxUploadSize” value=“5000000” />
< /bean>
如果是web前端from表单提交,from标签需要多加enctype属性
图片上传例子:
在更新商品方法中添加图片上传逻辑
/**

  • 更新商品
  • @param item
  • @return
  • @throws Exception
    */
    @RequestMapping(“updateItem”)
    public String updateItemById(Item item, MultipartFile pictureFile) throws Exception {
    // 图片上传
    // 设置图片名称,不能重复,可以使用uuid
    String picName = UUID.randomUUID().toString();
    // 获取文件名
    String oriName = pictureFile.getOriginalFilename();
    // 获取图片后缀
    String extName = oriName.substring(oriName.lastIndexOf("."));
    // 开始上传
    pictureFile.transferTo(new File(“C:/upload/image/” + picName + extName));
    // 设置图片名到商品中
    item.setPic(picName + extName);
    // -----------------------------------------.—
    // 更新商品
    this.itemService.updateItemById(item);
    return “forward:/itemEdit.action”;
    }

《json数据交互》
@RequestBody
接受json格式字符串,响应json格式字符串数据
当前端发送json字符串过来的时候,我们希望springmvc能够自动接受每个key并把每个key
对应的value封装到我们定义的java对象中去,而不需要我们手动进行赋值,此时我们就可以使用@RequestBody来进行操作

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上
这里再特别注意一下,@RequestBody可以接受的是《json格式的字符串》
一般当前端请求过来的是json数据的时候,为了方便自动封装到我们后台定义的对象中去,
前端ajax传递的数据可以JSON.stringify(data)先转换为字符串一下
< script type=“text/javascript”>
$(document).ready(function(){
var saveDataAry=[];
var data1={“userName”:“test”,“address”:“gz”};
bn var data2={“userName”:“ququ”,“address”:“gr”};
saveDataAry.push(data1);
saveDataAry.push(data2);
$.ajax({
type:“POST”,
url:“user/saveUser”,
dataType:“json”,
contentType:“application/json”,
data:JSON.stringify(saveData),
success:function(data){
}
});
});
< /script>

/**

  • 测试json的交互
  • @param item
  • @return
    */
    @RequestMapping(“testJson”)
    // @ResponseBody
    public @ResponseBody Item testJson(@RequestBody Item item) {
    return item;
    }
    参数为接受json格式字符串,public后面的为返回json格式字符串
    当json的key和java对象的字段相同,就可以进行自动赋值,无需我们手动赋值

配置json转换器
如果不使用注解驱动< mvc:annotation-driven />,就需要给处理器适配器配置json转换器,参考之前学习的自定义参数绑定。

在springmvc.xml配置文件中,给处理器适配器加入json转换器:
< !–处理器适配器 -->
< bean class=“org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter”>
< property name=“messageConverters”>
< list>
< bean class=“org.springframework.http.converter.json.MappingJacksonHttpMessageConverter”></ bean>
< /list>
< /property>
< /bean>
《拦截器》
springmvc中的拦截器执行顺序
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用

springmvc中拦截器使用分为2大步
1.一般拦截器需要实现HandlerInterceptor接口,类中逻辑自己定义:
2.在springmvc中配置拦截器

public class HandlerInterceptor1 implements HandlerInterceptor {
// Controller执行前调用此方法
// 返回true表示继续执行,返回false中止执行
// 这里可以加入登录校验、权限拦截等
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    System.out.println("HandlerInterceptor1....preHandle");
    // 设置为true,测试使用
    return true;
}

// controller执行后但未返回视图前调用此方法
// 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
        throws Exception {
    System.out.println("HandlerInterceptor1....postHandle");
}

// controller执行后且视图返回后调用此方法
// 这里可得到执行controller时的异常信息
// 这里可记录操作日志
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
        throws Exception {
    System.out.println("HandlerInterceptor1....afterCompletion");
}
}

< !-- 配置拦截器 -->
< mvc:interceptors>
< mvc:interceptor>
< !-- 所有的请求都进入拦截器 -->
< mvc:mapping path="/" />
< !-- 配置具体的拦截器 自己定义的拦截器类全名–>
< bean class=“cn.itcast.ssm.interceptor.HandlerInterceptor1” />
< /mvc:interceptor>
< mvc:interceptor>
< !-- 所有的请求都进入拦截器 -->
< mvc:mapping path="/
" />
< !-- 配置具体的拦截器 -->
< bean class=“cn.itcast.ssm.interceptor.HandlerInterceptor2” />
< /mvc:interceptor>
< /mvc:interceptors>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值