Spring MVC

一、概述

官方文档:
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程序

  1. 配置版
  2. 注解版
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

注意:

  1. 在请求地址中写明参数 @RequestMapping(“/commit/{p1}/{p2}”)
  2. 在方法中添加@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

  1. 正常情况下的正确处理:
@GetMapping("/t1")
public String test1(String name, Model model){
    // 1. 接收前端参数
    System.out.println("前端参数为:"+name);
    // 2. 将返回的结果传递给前端
    model.addAttribute("msg",name);
    // 3. 跳转视图
    return "test";
}

  1. 提交的域名称和处理方法的参数名不一致
    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";
}

  1. 提交的是一个对象

直接使用User接收,但需要保证,前端传递的参数名和对象名必须一致,否则就是null或0。

// 前端接收的为id,name,age
@GetMapping("/t3")
public String test(User user){
    System.out.println(user);
    return "test";
}

六、Json

Jackson

  1. 导入依赖
<!--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>

  1. 使用对象
    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则不会进行拦截

使用

  1. 实现 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()方法可以用于处理一些日志等功能。

  1. 在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>

总结

  1. 过滤器与拦截器的区别

    • 过滤器是servlet规范中的一部分,任何java web工程都可以使用。拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用。拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js则不会进行拦截。
  2. 一个类实现了HandlerInterceptor接口就是一个拦截器,在springmvc中注册即可使用。

  3. 拦截一般在preHandle()方法中处理,而postHandle()方法可以用于处理一些日志等功能。

  4. preHandle()在请求处理的方法之前执行,如果返回true执行下一个拦截器,如果返回false就不执行下一个拦截器。

  5. 将HttpSession session作为一个参数就可获取到session。

  6. 前端通过${pageContext.request.contextPath}可以获取上下文路径。
    WEB-INF下的所有页面和资源,只能通过Controller或Servlet进行访问。

九、上传、下载文件

前期准备

  1. 前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器;

  2. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值