浅谈SpringMVC(一)

浅谈SpringMVC(一)

SpringMVC介绍

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还可以是 Struts 这样的 Web 框架。

**总结:**SpringMVC和Spring是一个公司研发的产品,所以可以无缝间接,SpringMVC就是使前后端数据交互变得更加简洁的框架.就是在使用了SpringMVC以后,真的是太香了.

前后端交互问题

在没有SpringMVC之前,我们是如何实现向后端交互的?相信大家心里有答案,就是使用Servelet,通过Serverlet规范中的两个接口HttpServeletRequest/HttpServeletResponse来接受请求,以及做出响应,我们通过代码还原一下这个操作

大概是这个样子~~

@WebServlet(urlPatterns = "/loginto")
public class Loginto extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.解决请求中文乱码问题
        req.setCharacterEncoding("utf-8");
        // 2.解决响应中文乱码问题
        resp.setContentType("text/html;charset=utf-8");
        String username = req.getParameter("username");
        String pwd = req.getParameter("pwd");

首先要继承HttpServelet,并且实现doGet/doPoset方法,分别处理不同的请求,这样就很啰嗦.

Servelet的一些弊端:

1.只能处理get/post请求,不满足其他的业务请求

2.每一个请求,都需要对应一个Servelet,代码太繁琐

3.发出的请求参数都是字符串,有时我们需要手动强转为Integer

接下来我们根据SpringMVC框架对其进行优化.上代码~~

代码说明

优化一

1.准备一个物料类User

public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.新建一个controller包,在包下新建UserController类

@Controller
public class UserController {
    @RequestMapping("/user/findUser")
    @ResponseBody
    public String findUser(HttpServletRequest request, HttpServletResponse response){
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        int intid = Integer.parseInt(id);
        return intid+":"+name+":"+age;
    }
}

这里我们不在需要实现HttpServelet了,我们通过几个注解来取代之前繁琐的代码

注解介绍一

@Controller:之前我们在讲解AOP时已经说过,作用就是将这个类对象交给Spring管理,现在我们在细化一下,被这个注解标明的,说明,该类被SpringMVC框架管理

@RequestMapping(请求路径):负责用户的请求路径与后台服务器之间的映射关系,如果请求路径不匹配就会报404

@ResponseBody:将服务器的返回值转化为json,如果返回值是String那么就直接返回,json串本身就是字符串

我们这样处理完毕后,发现代码量还是很繁琐,继续优化.

优化二

//URL:http://localhost:8080/user/findUser2?id=1&name=cat&age=10
    @RequestMapping("/user/findUser2")
    @ResponseBody
    public String findUser(Integer id, String name, Integer age){
        return id+":"+name+":"+age;
    }

SpringMVC已经帮我们封装好了取值的方法,我们直接填写参数就能获得数据.

规则:保证参数和对象属性一致.

这样代码看起来就少了很多,因为SpringMVC帮我们做的太多了,向那些大佬低头.

现在我们只有三个参数,以后随着业务的增加,参数越来越多,我们还会一个一个的赋值吗?显然不会,接下来我们可以通过对象直接接收参数

优化三

 @RequestMapping("/user/getUser")
    @ResponseBody
    public User getUser(User user){
        return user;
    }

随着代码一步步被优化,代码量是不是越来越少了呢?使用对象接收时,要注意,必须提供get/set方法,SpringMVC帮我们自动赋值.

优化四

通过观察上面的代码,我们发现@ResponseBody注解都要重复写一遍,路径中的前缀/user也要写,我们可以将重复的提取出来.

//@Controller
//@ResponseBody
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("//findUser")
    
    public String findUser(HttpServletRequest request, HttpServletResponse response){
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        int intid = Integer.parseInt(id);
        return intid+":"+name+":"+age;
    }

    //URL:http://localhost:8080/user/findUser2?id=1&name=cat&age=10
    @RequestMapping("/findUser2")
    
    public String findUser(Integer id, String name, Integer age){
        return id+":"+name+":"+age;
    }

    @RequestMapping("/getUser")
    
    public User getUser(User user){
        return user;
    }
}

这里用到一个新的注解:@RestController:这个注解等于@Controller+@ResponseBody

到此为止使用SpringMVC接收的方式就优化完毕了.是不是很方便使用呢.接下来再介绍一种结构.

###RestFul结构

首先我们看一下get请求的格式:http://localhost:8080/user/getUser?id=1&name=cat&age=10

对比restFul结构:http://localhost:8080/user/getUser/1/cat/10

通过代码看一下restFul结构是如何接收参数的

  //URL:http://localhost:8080/user/getUser2?id=1&name=cat&age=10
    @RequestMapping("/getUser2/{id}/{name}/{age}")
    public String getUser(@PathVariable Integer id,@PathVariable String name, @PathVariable Integer age){
        return id+":"+name+":"+age;
    }

规则:路径中接收参数时,变量名需要用{…}括住

参数需用@PathVariable注解修饰,同样参数过多的情况可以通过对象接收

 @RequestMapping("/getUser3/{id}/{name}/{age}")
    public User getUser2(User user){
        return user;
    }

至此RestFul结构说明完毕.那么这种结构的用途是什么呢?restFul主要用于更新操作.

SpringMVC流程图

最后我们看一个流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ye7VgvOE-1643374168791)(C:\Users\Administrator\Desktop\第三阶段\SpringMVC.png)]

**注意:**第6,第7步我们不需要再做了,现在可以通过@ResponseBody直接解析数据.

return user;
}

至此RestFul结构说明完毕.那么这种结构的用途是什么呢?restFul主要用于更新操作.

## SpringMVC流程图

最后我们看一个流程图

![在这里插入图片描述](https://img-blog.csdnimg.cn/971c82408ed148648e96a2f447b83711.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVsbG_vvIFqb3nlhYjnlJ8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

**注意:**第6,第7步我们不需要再做了,现在可以通过@ResponseBody直接解析数据.















  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是一个基于Java的Web开发框架,它通过使用MVC(Model-View-Controller)设计模式来实现Web应用程序的开发。Spring MVC的工作原理如下: 1. 客户端发送请求:当客户端发送一个HTTP请求时,请求首先到达DispatcherServlet,它是Spring MVC框架的中央控制器。 2. DispatcherServlet处理请求:DispatcherServlet根据配置的URL映射规则,将请求分派给合适的处理器(Handler)。 3. 处理器处理请求:处理器是一个实现了Controller接口或使用注解标识的类,它负责处理请求并生成相应的模型数据和视图。 4. 模型数据处理:处理器可以访问数据库、调用服务层或执行其他操作来生成模型数据。模型数据通常是一个Java对象,它封装了需要在视图中显示的数据。 5. 视图解析:处理器将模型数据传递给视图解析器,视图解析器根据配置的规则找到相应的视图(如JSP、Thymeleaf、Freemarker等),并将模型数据填充到视图中。 6. 视图渲染:视图解析器将视图渲染为HTML、XML或其他格式,并将其发送给客户端作为响应。 7. 响应发送:DispatcherServlet将响应发送回客户端,并完成一次请求-响应周期。 Spring MVC框架提供了许多组件来支持请求处理,如处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)等。这些组件可以根据需要进行配置,以适应不同的开发需求。 总结起来,Spring MVC的工作原理是通过DispatcherServlet作为中央控制器来接收和分派请求,处理器处理请求并生成模型数据,视图解析器将模型数据填充到视图中,并将渲染后的视图发送回客户端。这种架构使得开发者可以更加专注于业务逻辑的实现,提高了Web应用程序的可维护性和扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值