- SpringMVC的响应数据
1. 返回值为字符串:
* 无关键字:表示跳转到对应的jsp页面,通过视图解析器查找相应资源
* 关键字:
forward:/WEB-INF/pages/success.jsp
redirect:/index.jsp
2. 返回值为void:
表示默认跳转到该RequestMapping中path属性值的jsp页面
* 参数列表传入HttpServletRequest和HttpServletResponse对象,然后调用重定向或者转发方法
request转发需要手动写全资源文件在本项目的路径
response重定向构建路径时需要加上request》getContextPath()前缀
3. 返回值为ModelAndView对象:
ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
* 在方法中创建一个ModelAndView对象
* 使用ModelAndView对象的addObject方法可以将属性和值存入到request域中
* 使用ModelAndView对象的setViewName方法可以跳转到指定页面(通过视图解析器来查找指定页面)
- SpringMVC实现异步请求
1. 出现问题:
a. DispatcherServlet控制器拦截了所有请求,此时需要释放关于静态资源的请求
在/resource/springmvc.xml配置中前端控制器,相应静态资源不拦截
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
<mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
2. 加载jQuery文件
3. 导入jar包,用于解析json数据
ackson-databind.jar
jackson-core.jar
ackson-annotations.jar
4. 使用@RequestBody注解可以自动调用相应jar包将json字符串封装到Bean对象中
5. 使用@ResopnseBody注解可以自动调用相应jar包将Bean对象转化为json格式字符串
6. 使用:
$(function(){
// 绑定点击事件
$("#btn").click(function(){
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"addressName":"哈哈","addressNum":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.addressName);
}
});
});
});
//在方法中使用注解自动调用相应jar包来转化
@RequestMapping("/testJson")
public @ResponseBody Address testJson(@RequestBody Address address) {
System.out.println(address);
//可以修改对象属性
address.setAddressName("上海");
return address;
}
- SpringMVC实现文件管理
1. 前提:
a. enctype属性:表单请求正文的类型
form表单的enctype取值必须是:multipart/form-data
默认值为:application/x-www-form-urlencoded
b. method属性:表单提交方式
必须为post(可以上传不限制大小的文件)
c. 提供一个文件选择域:
<input type="file" />
2. 导入相关jar包
commons-fileupload.jar
commons-io.jar
3. 传统方式实现文件上传:
@Controller
@RequestMapping(value="/fileupload")
public String fileupload(HttpServletRequest request) throws Exception {
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FileItem> list = fileUpload.parseRequest(request);
for (FileItem fileItem : list) {
if(fileItem.isFormField()) {
}else {
String filename = fileItem.getName();
fileItem.write(new File(file, filename));
fileItem.delete();
}
}
return "success";
}
4. 基于SpringMVC框架实现文件上传
* 配置好文件解析器后,不再需要自己去解析request域来获取文件对象
* 文件解析器配置的id值必须为multipartResolver
* 直接在对应的方法参数中传入MultipartFile对象作为参数,框架自动封装文件对象到该变量中去
* 此时,要求表单中file类型的input标签其name属性值必须与MultipartFile类型变量名相同
/resource/springmvc.xml
<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
/Upload.java
@RequestMapping(value="/fileupload2")
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception {
System.out.println("SpringMVC方式的文件上传...");
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
filename = uuid+"_"+filename;
upload.transferTo(new File(file,filename));
return "success";
}
- springmvc跨服务器方式文件上传
1. 实际应用过程中,可能需要不同功能的服务器:
* 应用服务器:部署应用
* 数据库服务器:运行数据库
* 缓存和消息服务器:处理大并发访问的缓存和消息
* 文件服务器:存储用户上传的文件
2. 跨服务器文件上传相关jar包:
jersey-client.jar
jersey-core.jar
3. 使用步骤:
* 跨服务器上传不再需要创建本地文件夹,但是需要指明文件服务器的存储路径(url)
* 由应用服务器获取到upload文件后,向文件服务器上传
a. 创建客户端对象
b. 和文件服务器建立连接
c. 上传文件
@RequestMapping("/fileupload")
public String fileupload3(MultipartFile upload) throws Exception {
System.out.println("SpringMVC跨服务器方式的文件上传...");
String path = "http://localhost:9090/fileService/uploads/";
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
filename = uuid+"_"+filename;
Client client = Client.create();
WebResource webResource = client.resource(path+filename);
webResource.put(upload.getBytes());
return "success";
}
- SpringMVC中的异常处理
1. 由Controller处理器将异常抛给前端控制器后,可以配置异常处理器组件处理异常,而不是抛给浏览器显示
2. 异常处理步骤:
a. 编写自定义异常类(用于显示提示信息),继承自Exception类
b. 在可能出现异常的代码上包裹try/catch,在catch中throw new 自定义异常类()
c. 编写异常处理器类,需要实现HandlerExceptionResolver接口,并实现抽象方法(处理异常业务)
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
CustomException customException = null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException = new CustomException("系统错误,请与系统管理 员联系!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
d. 配置异常处理器
使用bean标签将自定义异常处理类配置到springmvc.xml中
<bean id="xxx" class="自定义异常处理器类全路径"></bean>
- SpringMVC中的拦截器
1. 拦截器与过滤器
过滤器是servlet规范中的一部分,任何java web工程都可以使用。
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
过滤器在url-pattern中配置了("/*")之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的Controller中的方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
它也是AOP思想的具体应用。
我们要想自定义拦截器, 要求必须实现:HandlerInterceptor接口。
2. HandlerInterceptor接口内部已经实现了其方法的默认形式
对其中的方法进行重写可以自定义拦截器的功能
* preHandle方法是controller方法执行前拦截的方法
1. 可以使用request或者response跳转到指定的页面
2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
3. return false不放行,不会执行controller中的方法。
* postHandle是controller方法执行后执行的方法,在JSP视图执行前。
1. 可以使用request或者response跳转到指定的页面
2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
* afterCompletion方法是在JSP页面执行后执行
1. request或者response不能再跳转页面了
3. 在spring.xml文档中配置拦截器
/resource/sprinmvc.xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/user/*"/>
<!--
或者配置哪些方法不进行拦截
<mvc:exclude-mapping path=""/>
-->
<!-- 注册拦截器对象 -->
<bean class="cn.itcast.demo1.MyInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/**"/>
<!-- 注册拦截器对象 -->
<bean class="cn.itcast.demo1.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>