一、概述
官方文档:
https://docs.spring.io/spring-framework/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring MVC的特点
- 轻量级,简单易学
- 高效 , 基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 约定优于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题等
- 简洁灵活
Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。
DispatcherServlet的作用是将请求分发到不同的处理器。DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
二、第一个SpringMVC程序
- 配置版
- 注解版
https://blog.csdn.net/weixin_45842494/article/details/122831948
三、RestFul风格
1、概述
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
2、解释
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、 删除、修改、查询。
传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
使用RESTful操作资源 : 可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
3、使用
区别不同的请求方式使用的注解如下:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
注意:
- 在请求地址中写明参数 @RequestMapping(“/commit/{p1}/{p2}”)
- 在方法中添加@PathVariable注解
@Controller
public class RestFulController {
//映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2,Model model){
String result = p1+p2; // p2由int类型该为了String类型
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "结果:"+result);
//返回视图位置
return "test";
}
}
四、转发、重定向
SpringMVC的转发、重定向:
转发:return “test”; 默认
重定向:return “redirect:/index.jsp”;
@Controller
public class ControllerTest4 {
@RequestMapping("/rsm2/t1")
public String test1(Model model){
model.addAttribute("msg","/rsm2/t1");
//转发
return "test";
}
@RequestMapping("/rsm2/t2")
public String test2(Model model){
model.addAttribute("msg","/rsm2/t2");
//重定向
return "redirect:/index.jsp";
//return "redirect:hello.do"; //hello.do为另一个请求/
}
}
五、处理提交数据
http://localhost:8080/user/t1?name=jiangnan
- 正常情况下的正确处理:
@GetMapping("/t1")
public String test1(String name, Model model){
// 1. 接收前端参数
System.out.println("前端参数为:"+name);
// 2. 将返回的结果传递给前端
model.addAttribute("msg",name);
// 3. 跳转视图
return "test";
}
- 提交的域名称和处理方法的参数名不一致
http://localhost:8080/user/t2?username=jiangnan
解决:在接受参数上添加 @RequestParam(“username”) String name
@GetMapping("/t2")
public String test2(@RequestParam("username") String name, Model model){
// 1. 接收前端参数
System.out.println("前端参数为:"+name);
// 2. 将返回的结果传递给前端
model.addAttribute("msg",name);
// 3. 跳转视图
return "test";
}
- 提交的是一个对象
直接使用User接收,但需要保证,前端传递的参数名和对象名必须一致,否则就是null或0。
// 前端接收的为id,name,age
@GetMapping("/t3")
public String test(User user){
System.out.println(user);
return "test";
}
六、Json
Jackson
- 导入依赖
<!--https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jacksoncore -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
- 使用对象
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(user);
writeValueAsString(list)支持多种格式
@RestController
public class UserController {
@RequestMapping(value = "/json1")
public String json1() throws JsonProcessingException {
//创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("江南烟雨", 3, "男");
//将我们的对象解析成为json格式
String str = mapper.writeValueAsString(user);
//同样支持多种格式String str = mapper.writeValueAsString(list);
//由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
return str;
}
}
FastJSON
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
-
【JSONObject 代表 json 对象 】
- JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的。
- JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
-
【JSONArray 代表 json 对象数组】
- 内部是有List接口中的方法来完成操作的。
-
【JSON 代表 JSONObject和JSONArray的转化】
- JSON类源码分析与使用
- 仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间
的相互转化。
常用方法
@RestController
public class FastJsonController {
@RequestMapping("/fastjson")
public String fastjson(){
//创建一个对象
User user1 = new User("江南烟雨1", 3, "男");
User user2 = new User("江南烟雨2", 3, "男");
User user3 = new User("江南烟雨3", 3, "男");
User user4 = new User("江南烟雨4", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("*******Java对象 转 JSON字符串*******");
String str1 = JSON.toJSONString(list);
System.out.println("JSON.toJSONString(list)==>"+str1);
String str2 = JSON.toJSONString(user1);
System.out.println("JSON.toJSONString(user1)==>"+str2);
System.out.println("\n****** JSON字符串 转 Java对象*******");
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
System.out.println("\n****** Java对象 转 JSON对象 ******");
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1);
System.out.println("(JSONObject)JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
System.out.println("\n****** JSON对象 转 Java对象 ******");
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println("JSON.toJavaObject(jsonObject1,User.class)==>"+to_java_user);
return str1;
}
}
七、Ajax
代表异步JavaScript和XML,是一种在无需重新加载整个页面的情况下,能够更新部分数据,在不更新整个页面的前提下维护数据。
例如,百度搜索框
主要是前端做得事情,此处不过多说明
八、拦截器
概述
SpringMVC的处理器拦截器(利用AOP的思想实现)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器:
- servlet规范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截,包括视图。
拦截器
- 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 拦截器只会拦截访问的Controller中的方法, 如果访问的是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("=============处理前================");
//在请求处理的方法之前执行
//如果返回true执行下一个拦截器
//如果返回false就不执行下一个拦截器
return true;
}
//在请求处理方法执行之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("==============处理后===================");
}
//在dispatcherServlet处理后执行,做清理工作.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("==============清理=====================");
}
}
拦截一般在preHandle()方法中处理,而postHandle()方法可以用于处理一些日志等功能。
- 在applicationContext中配置拦截器
<!--关于拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路径及其子路径-->
<!--/admin/** 拦截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<bean class="com.xxc.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
场景
用户登录进入主页 场景
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 如果是登陆页面则放行
System.out.println("uri: " + request.getRequestURI());
if (request.getRequestURI().contains("login")) {
return true;
}
HttpSession session = request.getSession();
// 如果用户已登陆也放行
if(session.getAttribute("user") != null) {
return true;
}
// 用户没有登陆跳转到登陆页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
<!--关于拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路径及其子路径-->
<!--/admin/** 拦截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<bean class="com.xxc.config.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
总结
-
过滤器与拦截器的区别
- 过滤器是servlet规范中的一部分,任何java web工程都可以使用。拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用。拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js则不会进行拦截。
-
一个类实现了HandlerInterceptor接口就是一个拦截器,在springmvc中注册即可使用。
-
拦截一般在preHandle()方法中处理,而postHandle()方法可以用于处理一些日志等功能。
-
preHandle()在请求处理的方法之前执行,如果返回true执行下一个拦截器,如果返回false就不执行下一个拦截器。
-
将HttpSession session作为一个参数就可获取到session。
-
前端通过${pageContext.request.contextPath}可以获取上下文路径。
WEB-INF下的所有页面和资源,只能通过Controller或Servlet进行访问。
九、上传、下载文件
前期准备
-
前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器;
-
maven
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--servlet-api导入高版本的-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
更多信息查看
https://blog.csdn.net/weixin_45842494/article/details/122951733