SpringMVC(二)
响应数据和结果视图
-
返回值分类:
- 字符串
- void
- ModelAndView 对象:是 spring 提供的一个对象,可以用来调整具体的 JSP 视图
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView执行了……");
User user = new User();
user.setUsername("jljl");
user.setPassword("456");
user.setAge(22);
mv.addObject("user",user);
mv.setViewName("success");
return mv;
}
-
SpringMVC 框架提供的 转发 和 重定向
@RequestMapping("testForwardOrRedict")
public String testForwardOrRedict(){
System.out.println("testForwardOrRedict执行了……");
return "redirect:/index.jsp";
}
-
ResponseBody 响应 json 数据
- 过滤静态资源:由于web.xml中配置前端控制器时设置了拦截所有资源,导致jsp页面无法加载到JQuery文件,所以要进行这样的设置。
<mvc:resources location="/js/" mapping="/js/**"/>
<script src="${pageContext.request.contextPath}/js/jquery-3.1.1.min.js"></script>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
//发送ajax请求
$.ajax({
url:"${pageContext.request.contextPath}/user/testAjax",
contentType:"application/json;charset=utf-8",
data:'{"username":"jinlu","password":"123","age":22}',
dataType:"json",
type:"post",
success:function (data) {
//data:服务器响应的 json 数据,进行解析
}
});
});
});
</script>
<button id="btn">发送 ajax 请求</button>
@RequestMapping("testAjax")
public void testAjax(@RequestBody String body){
System.out.println("testAjax执行了……");
System.out.println(body);
}
-
响应 json 数据格式
- json 字符串和 JavaBean 对象互相转换过程中,需要使用 jackson 的 jar 包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
//alert("hello btn");
//发送ajax请求
$.ajax({
url:"${pageContext.request.contextPath}/user/testAjax",
contentType:"application/json;charset=utf-8",
data:'{"username":"jinlu","password":"123","age":22}',
dataType:"json",
type:"post",
success:function (data) {
//data:服务器响应的 json 数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
@RequestMapping("testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax执行了……");
System.out.println(user);
user.setUsername("LULU");
user.setAge(40);
return user;
}
springMVC实现文件上传
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<form action="user/fileUpload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload" /><br/>
<input type="submit" value="上传"/>
</form>
@RequestMapping("/fileUpload1")
public String fileUpload1(HttpServletRequest request) throws Exception {
System.out.println("fileUpload1执行了……");
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
if (!file.exists()){
file.mkdirs();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
for (FileItem item: items) {
if (item.isFormField()){
}else{
String filename = item.getName();
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + "_" + filename;
item.write(new File(path,filename));
item.delete();
}
}
return "success";
}
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
@RequestMapping("/fileUpload2")
public String fileUpload2(HttpServletRequest request, MultipartFile upload) throws IOException {
System.out.println("fileUpload2执行了……");
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().replace("-","");
filename = uuid + "_" + filename;
upload.transferTo(new File(path,filename));
return "success";
}
-
springMVC 跨服务器方式文件上传
- 分服务器的目的
- 应用服务器:负责部署到我们的应用。
- 数据库服务器:运行我们的数据库。
- 缓存和消息服务器:负责处理大并发访问的缓存和消息。
- 文件服务器:负责存储用户上传文件的服务器。
依赖注入:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
后台控制:
@RequestMapping("/fileUpload3")
public String fileUpload3(MultipartFile upload) throws IOException {
System.out.println("fileUpload3执行了……");
String path = "http://localhost:9990/uploads/";
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-","");
filename = uuid + "_" + filename;
Client client = Client.create();
WebResource webResource = client.resource(path + filename);
webResource.put(upload.getBytes());
return "success";
}
上传失败,出现错误HTTP Status 500 - Request processing failed; nested exception is com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:9090/uploads/69f070620aa54e2f97a2c62299e02d14_1715-9.jpg returned a response status of 403 Forbidden
原因是跨服务器上传文件,但是文件不能写入,需要在 tomcat 目录下conf文件夹下的 web.xml 的<servlet>
配置中加入:
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
springMVC中的异常处理
public class SysException extends Exception {
private String message;
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {
this.message = message;
}
}
- 异常处理器:必须实现
HandlerExceptionResolver
public class SysExceptionResolver implements HandlerExceptionResolver {
@Nullable
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @Nullable Object o, Exception e) {
SysException sysException = null;
if (e instanceof SysException){
sysException = (SysException) e;
}else {
sysException = new SysException("系统正在维护……");
}
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg",sysException.getMessage());
mv.setViewName("error");
return mv;
}
}
<bean id="sysExceptionResolver" class="com.ssm.exception.SysExceptionResolver"/>
@RequestMapping("/testException")
public String testException() throws SysException {
System.out.println("testException执行了...");
try {
int i = 10/0;
} catch (Exception e) {
e.printStackTrace();
throw new SysException("查询所有用户信息出错……");
}
return "success";
}
springMVC中的拦截器
-
拦截器类似于Servlet 中的过滤器 Filter,用于对处理器进行预处理和后处理。
-
拦截器 & 过滤器
- 过滤器是servlet 规范中的一部分,任何 Javaweb 工程都可以使用。
- 拦截器是springMVC自己的,只有使用了springMVC框架的工程才能使用。
- 过滤器在url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
- 拦截器只会拦截访问的控制器方法,如果访问的是jsp、html、css、image或者 js 是不会进行拦截的。
-
流程:
- 编写拦截器类,实现
HandlerInterceptor
接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor执行了...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor执行了...后");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("MyInterceptor执行了...最后");
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<bean class="com.ssm.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)