浅谈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直接解析数据.