栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅谈SpringMVC(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈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:UsersAdministratorDesktop第三阶段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直接解析数据.















转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722029.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号