SpringMVC进阶(四)

来源:互联网 发布:mac下html5开发工具 编辑:程序博客网 时间:2024/06/14 08:32
6异常处理
6.1异常处理思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throwsException向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:


SpringMVC进阶(四)




6.2自定义异常类

对不同的异常类型定义异常类,继承Exception。

public classCustomException extends Exception {
//异常信息
public Stringmessage;
publicCustomException(String message){
super(message);
this.message =message;
}

public StringgetMessage() {
returnmessage;
}

public voidsetMessage(String message) {
this.message =message;
}
}


6.3全局异常处理器

思路:
系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。
全局异常处理器处理思路:
解析出异常类型
如果该 异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示
如果该 异常类型不是系统自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)

springmvc提供一个HandlerExceptionResolver接口

@Override
public ModelAndViewresolveException(HttpServletRequest request,
HttpServletResponseresponse, Object handler, Exception ex) {
//handler就是处理器适配器要执行Handler对象(只有method)
//解析出异常类型
// 如果该 异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示
// String message =null;
// if(ex instanceofCustomException){
// message =((CustomException)ex).getMessage();
//}else{
//// 如果该 异常类型不是系统自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
//message="未知错误";
// }
//上边代码变为
CustomExceptioncustomException = null;
if(ex instanceofCustomException){
customException =(CustomException)ex;
}else{
customException = newCustomException("未知错误");
}
//错误信息
String message =customException.getMessage();
ModelAndView modelAndView= new ModelAndView();
//将错误信息传到页面
modelAndView.addObject("message",message);
//指向错误页面
modelAndView.setViewName("error");

returnmodelAndView;
}


6.4错误页面
《body》
${message}
《/body》



6.5在springmvc.xml配置全局异常处理器
《!--全局异常处理器
只要实现HandlerExceptionResolver接口就是全局异常处理器
--》
《beanclass="cn.itcast.ssm.exception.CustomExceptionResolver"》《/bean》



6.6异常测试

在controller、service、dao中任意一处需要手动抛出异常。
如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息,如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。

在商品修改的controller方法中抛出异常.




public StringeditItems(Model model,
@RequestParam(value ="id", required = true) Integer items_id)
throws Exception{

//调用service根据商品id查询商品信息
ItemsCustom itemsCustom =itemsService.findItemsById(items_id);
//判断商品是否为空,根据id没有查询到商品,抛出异常,提示用户商品信息不存在
if(itemsCustom ==null){
throw newCustomException("修改的商品信息不存在!");
}

//通过形参中的model将model数据传到页面
//相当于modelAndView.addObject方法
model.addAttribute("items",itemsCustom);

return"items/editItems";
}





在service接口中抛出异常:
@Override
public ItemsCustomfindItemsById(Integer id) throws Exception {
Items items =itemsMapper.selectByPrimaryKey(id);
if(items==null){
throw newCustomException("修改的商品信息不存在!");
}
如果与业务功能相关的异常,建议在service中抛出异常。
与业务功能没有关系的异常,建议在controller中抛出。

上边的功能,建议在service中抛出异常。







7上传图片

7.1需求
在修改商品页面,添加上传商品图片功能。

7.2springmvc中对多部件类型解析

在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。

在springmvc.xml中配置multipart类型解析器。


《!-- 文件上传--》
《beanid="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"》
《!-- 设置上传文件的最大尺寸为5MB--》
《propertyname="maxUploadSize"》
《value》5242880《/value》
《/property》
《/bean》



7.3加入上传图片的jar
上边的解析内部使用下边的jar进行图片上传。
commons-fileupload-1.2.2.jar
commons-io-2.4.jsr




7.4 创建图片虚拟 目录存储图片

通过图形界面配置:

SpringMVC进阶(四)

也可以直接修改tomcat的配置:
在conf/server.xml文件,添加虚拟目录 :

SpringMVC进阶(四)


注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。




7.5上传图片代码
7.5.1页面


《td》
《imgsrc="${pageContext.request.contextPath }/pic/${itemsCustom.pic}"width=100 height=100/》
《br/》
《input type="file" name="pictureFile"/》 
《/td》



7.5.2controller方法
修改:商品修改controller方法:
@RequestMapping("/editItemsSubmit")
public StringeditItemsSubmit(
Modelmodel,
HttpServletRequestrequest,
Integerid,
@ModelAttribute("items")@Validated(value = { ValidGroup1.class }) ItemsCustomitemsCustom,
BindingResultbindingResult,
MultipartFileitems_pic//接收商品图片
) throws Exception{





//原始名称
String originalFilename =items_pic.getOriginalFilename();
//上传图片
if(items_pic!=null&& originalFilename!=null &&originalFilename.length()>0){
//设置保存路径
String savePath =request.getServletContext().getRealPath("/pic");
//判断文件路径是否存在
File file = newFile(savePath);
if(!file.exists()){
file.mkdir();
}
//新的图片名称
String newFileName =UUID.randomUUID() +originalFilename.substring(originalFilename.lastIndexOf("."));
//新图片
File newFile = newFile(pic_path+newFileName);
//将内存中的数据写入磁盘
items_pic.transferTo(newFile);
//将新图片名称写到itemsCustom中
itemsCustom.setPic(newFileName);
}








8json数据交互

8.1为什么要进行json数据交互

json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。
比如:webservice接口,传输json数据.

8.2springmvc进行json交互


SpringMVC进阶(四)



请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。

2、请求key/value、输出json。此方法比较常用。

8.3环境准备

8.3.1加载json转的jar包
springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json转),如下:

jackson-core-asl-1.9.11.jar
jackson-mapper-asl-1.9.11.jar




8.3.2配置json转换器

在注解适配器中加入messageConverters

《!--注解适配器--》
《beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"》
《propertyname="messageConverters"》
《list》
《beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"》《/bean》
《/list》
《/property》
《/bean》

注意:如果使用《mvc:annotation-driven/》 则不用定义上边的内容。


8.4json交互测试

8.4.1输入json串,输出是json串
8.4.1.1jsp页面
使用jquery的ajax提交json串,对输出的json结果进行解析。


//提交json返回json
functionjsonRequest(){

$.ajax({
type:'post',
url:'${pageContext.request.contextPath}/requestJson.action',
//数据格式是json,商品信息
data:'{"name":"手机","price":"999"}',
contentType:'application/json;charset=utf-8',
success: function(data ){   //返回json结果
alert(data.name);
}
});
}
functionjsonResponse(){
$.ajax({
type:'post',
url:'${pageContext.request.contextPath}/responseJson.action',
data:"name=手机&price=99",
success: function(data){
alert(data.price);
}
});
}

《inputvalue="提交json,返回json" onclick="jsonRequest()"type="button"/》
   《input value="提交key/value,返回json"onclick="jsonResponse()" type="button"/》






8.4.1.2controller

@Controller
public class JsonTest{


//请求json(商品信息),输出json(商品信息)
//@RequestBody将请求的商品信息的json串转成itemsCustom对象
//@ResponseBody将itemsCustom转成json输出
@RequestMapping("requestJson.action")
public @ResponseBodyItemsCustom requestJson( @RequestBody ItemsCustomitemsCustom){
//@ResponseBody将itemsCustom转成json输出
returnitemsCustom;
}
//请求key/value,输出json
@RequestMapping("responseJson.action")
public @ResponseBodyItemsCustom responseJson(  ItemsCustomitemsCustom){
//@ResponseBody将itemsCustom转成json输出
returnitemsCustom;
}
}



提交json,返回json

SpringMVC进阶(四)



提交key/value,返回json

SpringMVC进阶(四)


9RESTful支持

9.1什么是RESTful
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

RESTful(即RepresentationalState Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。


1、对url进行规范,写RESTful格式的url

非REST的url:http://...../queryItems.action?id=001&type=T01
REST的url风格:http://..../items/001
特点:url简洁,将参数通过url传到服务端
2、http的方法规范
不管是删除、添加、更新。。使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加。。。

后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。

3、对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。。

9.2REST的例子
9.2.1需求
查询商品信息,返回json数据。

9.2.2controller
定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller.

输出json使用@ResponseBody将java对象输出json。



//查询商品信息,输出json
///itemsView/{id}里边的{id}表示占位符,通过@PathVariable获取占位符中的参数,
//如果占位符中的名称和形参名一致,在@PathVariable可以不指定名称
@RequestMapping("/itemsView/{id}")
public @ResponseBodyItemsCustom itemsView(@PathVariable("id") Integer id)throwsException{
//调用service查询商品信息
ItemsCustom itemsCustom =itemsServices.findById(id);
returnitemsCustom;
}



@RequestMapping(value="/itemsView/{id}"):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
如果RequestMapping中表示为"/itemsView /{id}",id和形参名称一致,@PathVariable不用指定名称。


9.2.3REST方法的前端控制器配置

在web.xml配置:
《!--springmvc前端控制器,rest配置 --》
《servlet》
《servlet-name》springmvc_rest《/servlet-name》
《servlet-class》org.springframework.web.servlet.DispatcherServlet《/servlet-class》
《!--contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等)如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml)--》
《init-param》
《param-name》contextConfigLocation《/param-name》
《param-value》classpath:spring/springmvc.xml《/param-value》
《/init-param》
《/servlet》

《servlet-mapping》
《servlet-name》springmvc_rest《/servlet-name》
《url-pattern》/《/url-pattern》
《/servlet-mapping》


结果:


SpringMVC进阶(四)


9.3对静态资源的解析

配置前端控制器的url-parttern中指定/,对静态资源的解析出现问题:



在springmvc.xml中添加静态资源解析方法。
《!--静态资源解析
包括:js、css、img、..
--》
《mvc:resourceslocation="/js/" mapping="/js/**"/》
《mvc:resourceslocation="/img/" mapping="/img/**"/》
0 0
原创粉丝点击