JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
SpringMVC
交互JSON数据
服务器接收JSON数据
一、引入jQuery
二、引入静态资源后,给js静态资源放行(非常重要)
把js下的静态资源映射到js目录下
<mvc:resources mapping="/js/*" location="/js/"></mvc:resources>
三、页面中发送ajax请求
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
<script type="text/javascript">
function execute() {
alert("执行");
$.ajax({
url:"${pageContext.request.contextPath}/user/testRequestJson",
data:{"username":"zhangsan","age":20},
type:"post",
dataType:"json",
success:function(data) {
}
});
}
</script>
四、服务器接收数据并打印
方式一:
@Controller
@RequestMapping("/user")
@SessionAttributes({"username","password"})
public class UserController {
/**
* 请求数据转换为json格式
*/
@RequestMapping("/testRequestJson")
public void testRequestJson(String username,Integer age){
System.out.println(username);
System.out.println(age);
}
}
方式二:把所有参数转化为字符串
首先引入依赖
<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-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
在形参中添加@RequestBody注解
/**
* @RequestBody 可以把所有的参数转换为字符串
* @param body
*/
@RequestMapping("/testRequestJson2")
public void testRequestJson2(@RequestBody String body){
System.out.println(body);
}
打印的结果
服务器回写JSON数据
服务器回写JSON数据:
使用注解@ResponseBody
标记了该注解的方法,数据会以流的方式返回
@RequestMapping("/testResponseBody")
@ResponseBody
public List<User> testResponseBody(){
//准备数据
List<User> userList = new ArrayList<>();
User user = new User();
user.setUsername("张三");
user.setPassword("123");
user.setId(2);
User user2 = new User();
user2.setUsername("张三2");
user2.setPassword("123");
user2.setId(3);
userList.add(user);
userList.add(user2);
return userList;
}
页面接收
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
<script type="text/javascript">
function execute() {
alert("执行");
$.ajax({
url:"${pageContext.request.contextPath}/user/testResponseBody",
data:{},
type:"post",
dataType:"json",
success:function(data) {
alert(data[0].username);
alert(data[1].username);
}
});
}
</script>
SpringMVC文件上传
一、引入依赖fileupload
,会自动依赖commons-io
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
二、页面配置
上传文件的表单前提:
- 提交方式必须为
post
- 表单的类型必须是
multipart/form-data
,多功能的表单数据 - 必须有一个
type=file
的表单元素
<body>
<form action="${pageContext.request.contextPath}/user/upload" method="post" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
</body>
三、spring-mvc.xml配置:可以设置上传文件的限制
<!-- 配置文件上传解析器 -->
<!-- id的值是固定的-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
四、文件上传
考虑两点:
- 上传的目标路径
- 文件名永不重复
package com.itheima.controller;
import com.itheima.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Controller
@RequestMapping("/user")
@SessionAttributes({"username","password"})
public class UserController {
/**
* 声明参数变量,接收数据
*/
@RequestMapping("/upload")
public String upload(String username, MultipartFile upload, HttpServletRequest request){
//System.out.println(upload);
//1.目标路径
//获取项目运行的路径
String realPath = request.getSession().getServletContext().getRealPath("/upload");
//判断该路径是否存在
File realFile = new File(realPath);
if (!realFile.exists()){
realFile.mkdirs();
}
//2.获取唯一的文件名(包含扩展名)
String uuid = UUID.randomUUID().toString().replace("-", "");
//获取扩展名:获取文件名
//获取真实的文件名
String originalFilename = upload.getOriginalFilename();
//截取字符串,获取文件扩展名
String extendName = originalFilename.substring(originalFilename.lastIndexOf("."));
//唯一的文件名
String fileName = uuid+extendName;
//文件上传transferTo,执行文件上传
//参数file:文件路径
try {
upload.transferTo(new File(realFile,fileName));
} catch (IOException e) {
e.printStackTrace();
}
return "show";
}
}
跨服上传
一、引入jersey服务器依赖
<!--引入jersey服务器的包-->
<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>
二、修改tomcat配置
tomcat默认不能跨服上传,在tomcat/conf/web.xml
中添加这句话
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
添加之后
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
三、配置图片服务器
- 创建一个web项目
- 配置一个tomcat和原来的tomcat端口号不一致
- 在webapp目录下创建一个upload目录
注意:空的文件夹不会编译,需要在目录中添加任意文件
四、跨服上传文件
<form action="${pageContext.request.contextPath}/user/uploadServer" method="post" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
@RequestMapping("/uploadServer")
public String uploadServer(MultipartFile upload){
//System.out.println(upload);
//1.配置图片服务器路径
String serverPath = "http://localhost:9090/img_server/upload/";
//2.获取唯一的文件名(包含扩展名)
String uuid = UUID.randomUUID().toString().replace("-", "");
//获取扩展名:获取文件名
//获取真实的文件名
String originalFilename = upload.getOriginalFilename();
//截取字符串,获取文件扩展名
String extendName = originalFilename.substring(originalFilename.lastIndexOf("."));
//唯一的文件名
String fileName = uuid+extendName;
System.out.println(fileName);
//跨服上传
//获取jersey服务器客户端
Client client = Client.create();
//配置上传资源路径的资源对象
WebResource resource = client.resource(serverPath + fileName);
//上传
//参数一:资源的类型
//参数二:文件的字节内容
try {
resource.put(String.class,upload.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return "show";
}
SpringMVC的统一异常处理
一、自定义异常
package com.itheima.exception;
public class CustomException extends Exception {
private String message;
public CustomException(String message) {
super(message);
this.message = message;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
二、定义异常的统一处理对象:实现HandlerExceptionResolver接口
注意:该对象需要被创建
package com.itheima.exception;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 异常解析器
*/
//创建该类对象
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {
//解析异常
/**
*
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e 其他模块传递过来的异常对象
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
//添加数据
if(e instanceof CustomException){
CustomException customException = (CustomException)e;
modelAndView.addObject("message",customException.getMessage());
}else {
modelAndView.addObject("message","系统发送错误,请联系管理员!!!");
}
//指定页面
modelAndView.setViewName("error");
return modelAndView;
}
}
三、错误页面
<%--
Created by IntelliJ IDEA.
User: admin
Date: 2020/5/10
Time: 17:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${message}
</body>
</html>