• 一文带你了解SpringMVC框架的基本使用


    1、传统SSH框架的模式

    SSH框架代表含义

    简称含义
    SSpringMVC/Struts
    SSpring
    HHibernate

    第一个S:表示的是控制器的解决方案,SpringMVC 是控制器的解决方案(相当于替代了原来的Servlet)

    第二个S:Spring(整合第三方框架、为Service层提供事务)

    第三个H:这个是DAO的解决方案

    2、有了Servlet为什么还要学习SpringMVC

    因为Servlet是最原生的实现、很多的实现 都比较繁琐:请求参数的自动封装、编码问题解决、文件的上传和下载问题、要实现防止重复提交的问题、在每一次编写请求的时候都需要带上方法名判断就变得复杂了、每一次跳转我们都需要自己去写代码、这就让这个Servlet的使用代码量就变得繁琐了。

    SpringMVC产生以后, 也就是说我们的SpringMVC只需要写很少的代码就能够完成上述的功能了

    3、SpringMVC到底是什么?

    SpringMVC实际上你可以认为就是一个Servlet的封装、只不过这个封装能够更好的解决Servlet中的所有问题

    4、SpringMVC能干什么?

    1. 请求参数的自动封装

    2. 编码问题的处理

    3. 请求的JSON格式自动转换成JAVA对象 返回的JAVA对象自动转换成JSON格式

    4. 页面跳转的封装

    5. 表单文件防止重复提交的问题

    6. 上传下载的简化

    7. 日期格式的自动转换

    8. SpringMVC的第一个HelloWorld程序

    5、SpringMVC的第一个HelloWorld程序

    5.1:导包

    Core 、aop、web、webmvc

    5.2:编写web.xml的配置文件

    1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    2. <display-name>Demo_SpringMVC_01display-name>
    3. <welcome-file-list>
    4. <welcome-file>index.htmlwelcome-file>
    5. <welcome-file>index.htmwelcome-file>
    6. <welcome-file>index.jspwelcome-file>
    7. <welcome-file>default.htmlwelcome-file>
    8. <welcome-file>default.htmwelcome-file>
    9. <welcome-file>default.jspwelcome-file>
    10. welcome-file-list>
    11. <servlet>
    12. <servlet-name>DispatcherServlet1servlet-name>
    13. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    14. servlet>
    15. <servlet-mapping>
    16. <servlet-name>DispatcherServlet1servlet-name>
    17. <url-pattern>*.actionurl-pattern>
    18. servlet-mapping>
    19. web-app>
    20. 复制代码

    5.3:在WEB-INF目录下创建一个名字和上面申明servlet名字-servlet.xml的配置文件(DispatcherServlet1-servlet.xml)

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:tx="http://www.springframework.org/schema/tx"
    7. xmlns:mvc="http://www.springframework.org/schema/mvc"
    8. xsi:schemaLocation="http://www.springframework.org/schema/beans
    9. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    10. http://www.springframework.org/schema/context
    11. http://www.springframework.org/schema/context/spring-context-4.0.xsd
    12. http://www.springframework.org/schema/aop
    13. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    14. http://www.springframework.org/schema/tx
    15. http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    16. http://www.springframework.org/schema/mvc
    17. http://www.springframework.org/schema/mvc/spring-mvc.xsd" default-autowire="byName">
    18. <bean name="/hello.action" class="com.qy.helloworld.HelloWorldControll">bean>
    19. beans>
    20. 复制代码

    5.4:编写一个HelloControll类实现于Controller接口

    1. public class HelloWorldControll implements Controller{
    2. @Override
    3. public ModelAndView handleRequest(HttpServletRequest request,
    4. HttpServletResponse response) throws Exception {
    5. System.out.println("我是Controll我执行了....");
    6. ModelAndView modelAndView=new ModelAndView();
    7. //设置跳转的页面
    8. modelAndView.setViewName("/yuyu.jsp");
    9. return modelAndView;
    10. }
    11. }
    12. 复制代码

    5.5:测试

    5.6:注意

    1. 配置文件的名字是不能乱写的,web.xml中配置的servlet的名字-servlet.xml配置的

    2. SpringMVC实际上只是Spring的一个模块 所以配置文件的约束是一样的

    3. 编写实现于Controll接口的这个重写的方法 里面的ModelAndView返回的是视图和数据的集合(这里的数据默认是放到了request域对象里面的)

    4. 在SpringMVC的配置文件中 name表示的是映射的路径、映射路径前面必须加上/

    5. 在编写配置文件的路径映射的时候 不能写 /.action(没有这种写法),/ *.action /anana/anan

    6、SpringMVC中配置文件路径的问题

    6.1:在src目录下创建一个自定义的文件夹config

    6.2: 在里面编写spring-mvc.xml配置文件

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:tx="http://www.springframework.org/schema/tx"
    7. xmlns:mvc="http://www.springframework.org/schema/mvc"
    8. xsi:schemaLocation="http://www.springframework.org/schema/beans
    9. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    10. http://www.springframework.org/schema/context
    11. http://www.springframework.org/schema/context/spring-context-4.0.xsd
    12. http://www.springframework.org/schema/aop
    13. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    14. http://www.springframework.org/schema/tx
    15. http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    16. http://www.springframework.org/schema/mvc
    17. http://www.springframework.org/schema/mvc/spring-mvc.xsd" default-autowire="byName">
    18. <bean name="/hello.action" class="com.qy.helloworld.HelloWorldControll">bean>
    19. beans>
    20. 复制代码

    6.3:在web.xml中增加这个映射路径

    1. <servlet>
    2. <servlet-name>DispatcherServlet1servlet-name>
    3. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    4. <init-param>
    5. <param-name>contextConfigLocationparam-name>
    6. <param-value>classpath:config/spring-mvc.xmlparam-value>
    7. init-param>
    8. servlet>
    9. <servlet-mapping>
    10. <servlet-name>DispatcherServlet1servlet-name>
    11. <url-pattern>*.actionurl-pattern>
    12. servlet-mapping>
    13. 复制代码

    7、SpringMVC的运行的逻辑是什么?

    1. 请求会被转发到映射器上面去 映射器的请求会将请求分离

    2. 映射器将分离出来的数据转发到适配器(适配器就专门来找 是实现了接口的控制器 还是继承于类的控制器 还是既没有实现接口 也没有继承类的这个控制器)

    3. 控制器拿到请求处理请求 返回数据和 返回视图 到 视图解析器

    4. 视图解析器拿到最终要跳转的页面 进行转发 转到 显示页面

    8、注解的模式怎么实现SpringMVC(常用)

    8.1:配置包的扫描(包的扫描:spring-mvc.xml)

    1. <context:component-scan base-package="com.qy.anotation">context:component-scan>
    2. <mvc:annotation-driven>mvc:annotation-driven>
    3. 复制代码

    8.2:使用常用的注解来完成操作

    • @Controll:表示当前的这个类是一个控制器

    • @RequestMapping:表示的是请求路径的映射

      • 用在类的上面表示的是全局的地址 所有的访问都必须带上这个地址
      • 用在方法上表示的是最后的映射路径
    • @GetMapping:这个表示的是当前的请求的方法必须是GET请求

    • @PostMapping:当前的请求必须是POST请求

    • @PutMapping("/login") //这个表示的是put方法的时候 会调用到这里来

    • @DeleteMapping("/login") //这个表示的是请求的方法必须是delete的时候才会被执行

    8.3:限定方法的访问

    1. /**
    2. * 登陆的方法
    3. * @Title: login
    4. * @Description: TODO
    5. * @param: @return
    6. * @return: String
    7. * @throws
    8. */
    9. @RequestMapping(value="login",method=RequestMethod.GET)
    10. public String login(){
    11. System.out.println("这里是登陆的方法");
    12. return "/yuyu/yuyu1.jsp";
    13. }
    14. /**
    15. * 限定当前的方法只能post请求访问
    16. * @Title: register
    17. * @Description: TODO
    18. * @param: @return
    19. * @return: String
    20. * @throws
    21. */
    22. @RequestMapping(value="register",method=RequestMethod.POST)
    23. public String register(){
    24. System.out.println("这里是注册的方法");
    25. return "/index.jsp";
    26. }
    27. 复制代码

    9、返回页面的问题

    1. /**
    2. * 返回页面的第一种方式 :直接返回一个页面
    3. * @Title: insert
    4. * @Description: TODO
    5. * @param: @return
    6. * @return: String
    7. * @throws
    8. */
    9. @RequestMapping("insert")
    10. public String insert(){
    11. System.out.println("我是部门的插入我执行了....");
    12. return "/index.jsp";
    13. }
    14. /**
    15. * 借助于ModelAndView来返回页面
    16. * @Title: insert
    17. * @Description: TODO
    18. * @param: @return
    19. * @return: String
    20. * @throws
    21. */
    22. @RequestMapping("insert1")
    23. public ModelAndView insert1(){
    24. ModelAndView modelAndView=new ModelAndView();
    25. modelAndView.setViewName("/index.jsp");
    26. System.out.println("我是部门的插入我执行了....");
    27. return modelAndView;
    28. }
    29. /**
    30. * 返回页面的第三种方式直接给个requset
    31. * @Title: insert2
    32. * @Description: TODO
    33. * @param: @param request
    34. * @param: @param response
    35. * @param: @throws ServletException
    36. * @param: @throws IOException
    37. * @return: void
    38. * @throws
    39. */
    40. @RequestMapping("insert2")
    41. public void insert2(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
    42. System.out.println("我是部门的插入我执行了....");
    43. request.getRequestDispatcher("/index.jsp").forward(request, response);
    44. }
    45. /**
    46. * 重定向进行页面的跳转
    47. * @Title: insert3
    48. * @Description: TODO
    49. * @param: @return
    50. * @param: @throws ServletException
    51. * @param: @throws IOException
    52. * @return: String
    53. * @throws
    54. */
    55. @RequestMapping("insert3")
    56. public String insert3() throws ServletException, IOException{
    57. System.out.println("我是部门的插入我执行了....");
    58. return "redirect:/index.jsp";
    59. }
    60. /**
    61. * 通知消息转换器可以配置这个前缀和后缀
    62. * @Title: insert3
    63. * @Description: TODO
    64. * @param: @return
    65. * @param: @throws ServletException
    66. * @param: @throws IOException
    67. * @return: String
    68. * @throws
    69. */
    70. @RequestMapping("/insert4.action")
    71. public String insert4() throws ServletException, IOException{
    72. System.out.println("我是部门的插入我执行了....");
    73. return "index";
    74. }
    75. 复制代码

    10、将数据放到request域对象的方法

    1. /**
    2. * 第一种将数据放到域对象的方法
    3. * @Title: data
    4. * @Description: TODO
    5. * @param: @return
    6. * @return: String
    7. * @throws
    8. */
    9. @RequestMapping("data")
    10. public String data(Model model){
    11. model.addAttribute("userName","小羽1");
    12. System.out.println("我是部门的插入我执行了....");
    13. return "/index.jsp";
    14. }
    15. /**
    16. * 借助于ModelAndView来返回页面
    17. * @Title: data
    18. * @Description: TODO
    19. * @param: @return
    20. * @return: String
    21. * @throws
    22. */
    23. @RequestMapping("data1")
    24. public String data1(HttpServletRequest request){
    25. request.setAttribute("userName","小羽2");
    26. return "/index.jsp";
    27. }
    28. /**
    29. * 返回页面的第三种方式直接给个requset
    30. * @Title: data2
    31. * @Description: TODO
    32. * @param: @param request
    33. * @param: @param response
    34. * @param: @throws ServletException
    35. * @param: @throws IOException
    36. * @return: void
    37. * @throws
    38. */
    39. @RequestMapping("data2")
    40. public ModelAndView data2() throws ServletException, IOException{
    41. ModelAndView modelAndView=new ModelAndView();
    42. modelAndView.setViewName("/index.jsp");
    43. modelAndView.addObject("userName","小羽3");
    44. return modelAndView;
    45. }
    46. 复制代码

    11、SpringMVC中参数的接受问题?

    11.1:接受普通参数和数组参数

    1. /**
    2. * 第一种接受数据的方法
    3. * @Title: param1
    4. * @Description: TODO
    5. * @param: @param userName
    6. * @param: @param password
    7. * @param: @return
    8. * @return: String
    9. * @throws
    10. */
    11. @RequestMapping("parame1")
    12. public String param1(String userName,String password){
    13. System.out.println("接受到的数据是:"+userName+"----"+password);
    14. return "/index.jsp";
    15. }
    16. /**
    17. * 接受数组类型的数据
    18. * @Title: param1
    19. * @Description: TODO
    20. * @param: @param userName
    21. * @param: @param password
    22. * @param: @param habbit
    23. * @param: @return
    24. * @return: String
    25. * @throws
    26. */
    27. @RequestMapping("parame2")
    28. public String param2(String userName,String password,int[] habbit){
    29. System.out.println("接受到的数据是:"+userName+"----"+password);
    30. System.out.println(Arrays.toString(habbit));
    31. return "/index.jsp";
    32. }
    33. /**
    34. * 请求的参数自动封装(对象的属性必须和表单提交的name是一一对应的)
    35. * @Title: param3
    36. * @Description: TODO
    37. * @param: @param user
    38. * @param: @return
    39. * @return: String
    40. * @throws
    41. */
    42. @RequestMapping("parame3")
    43. public String param3(User user){
    44. System.out.println(user);
    45. return "/index.jsp";
    46. }
    47. 复制代码

    11.2:接受集合类型的参数

    11.2.1:编写封装类

    1. public class ManyUser {
    2. private List<User> users=new ArrayList<User>();
    3. public List<User> getUsers() {
    4. return users;
    5. }
    6. public void setUsers(List users) {
    7. this.users = users;
    8. }
    9. @Override
    10. public String toString() {
    11. return "ManyUser [users=" + users + "]";
    12. }
    13. }
    14. 复制代码

    11.2.2:参数的接受

    1. @RequestMapping("parame5")
    2. public String param5(ManyUser manyUser){
    3. System.out.println(manyUser.getUsers());
    4. return "/index.jsp";
    5. }
    6. 复制代码

    11.2.3:编写jsp

    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2. HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    3. <html>
    4. <head>
    5. <title>My JSP 'param.jsp' starting pagetitle>
    6. <meta http-equiv="pragma" content="no-cache">
    7. <meta http-equiv="cache-control" content="no-cache">
    8. <meta http-equiv="expires" content="0">
    9. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    10. <meta http-equiv="description" content="This is my page">
    11. head>
    12. <body>
    13. 普通用户:
    14. <br>
    15. <form action="${pageContext.request.contextPath}/parame5.action"
    16. method="post">
    17. 用户名:<input type="text" name="users[0].userName"><br> 密码:<input
    18. type="password" name="users[0].password"><br> 你的爱好: 美女<input
    19. type="checkbox" name="users[0].habbit" value="1"> 帅哥<input
    20. type="checkbox" name="users[0].habbit" value="2"> 其他<input
    21. type="checkbox" name="users[0].habbit" value="3">
    22. <hr>
    23. 用户名:<input type="text" name="users[1].userName"><br> 密码:<input
    24. type="password" name="users[1].password"><br> 你的爱好: 美女<input
    25. type="checkbox" name="users[1].habbit" value="1"> 帅哥<input
    26. type="checkbox" name="users[1].habbit" value="2"> 其他<input
    27. type="checkbox" name="users[1].habbit" value="3">
    28. <hr>
    29. 用户名:<input type="text" name="users[2].userName"><br> 密码:<input
    30. type="password" name="users[2].password"><br> 你的爱好: 美女<input
    31. type="checkbox" name="users[2].habbit" value="1"> 帅哥<input
    32. type="checkbox" name="users[2].habbit" value="2"> 其他<input
    33. type="checkbox" name="users[2].habbit" value="3">
    34. <hr>
    35. <input type="submit" value="提交">
    36. form>
    37. body>
    38. html>
    39. 复制代码

    11.3:当两个对象在同一个Controll中需要接受并且两个对象的属性是一样的时候的区分

    1. 编写封装类
    1. public class UserAndAdmin {
    2. private User user;
    3. private Admin admin;
    4. public User getUser() {
    5. return user;
    6. }
    7. public void setUser(User user) {
    8. this.user = user;
    9. }
    10. public Admin getAdmin() {
    11. return admin;
    12. }
    13. public void setAdmin(Admin admin) {
    14. this.admin = admin;
    15. }
    16. @Override
    17. public String toString() {
    18. return "UserAndAdmin [user=" + user + ", admin=" + admin + "]";
    19. }
    20. }
    21. 复制代码
    1. 编写接受的controll
    1. @RequestMapping("parame4")
    2. public String param4(UserAndAdmin userAndAdmin){
    3. System.out.println(userAndAdmin.getUser());
    4. System.out.println(userAndAdmin.getAdmin());
    5. return "/index.jsp";
    6. }
    7. 复制代码
    1. 编写jsp
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2. HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    3. <html>
    4. <head>
    5. <title>My JSP 'param.jsp' starting pagetitle>
    6. <meta http-equiv="pragma" content="no-cache">
    7. <meta http-equiv="cache-control" content="no-cache">
    8. <meta http-equiv="expires" content="0">
    9. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    10. <meta http-equiv="description" content="This is my page">
    11. head>
    12. <body>
    13. 普通用户:
    14. <br>
    15. <form action="${pageContext.request.contextPath}/parame4.action"
    16. method="post">
    17. 用户名:<input type="text" name="user.userName"><br> 密码:<input
    18. type="password" name="user.password"><br> 你的爱好: 美女<input
    19. type="checkbox" name="user.habbit" value="1"> 帅哥<input
    20. type="checkbox" name="user.habbit" value="2"> 其他<input
    21. type="checkbox" name="user.habbit" value="3"> <input type="submit"
    22. value="提交">
    23. form>
    24. <hr>
    25. 管理员:
    26. <br>
    27. <form action="${pageContext.request.contextPath}/parame4.action"
    28. method="post">
    29. 用户名:<input type="text" name="admin.userName"><br> 密码:<input
    30. type="password" name="admin.password"><br> 你的爱好: 美女<input
    31. type="checkbox" name="admin.habbit" value="1"> 帅哥<input
    32. type="checkbox" name="admin.habbit" value="2"> 其他<input
    33. type="checkbox" name="admin.habbit" value="3"> <input type="submit"
    34. value="提交">
    35. form>
    36. body>
    37. html>
    38. 复制代码

    12、字符编码过滤器的使用(只是处理了POST请求)

    1. <filter>
    2. <filter-name>CharacterEncodingFilterfilter-name>
    3. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    4. <init-param>
    5. <param-name>encodingparam-name>
    6. <param-value>UTF-8param-value>
    7. init-param>
    8. filter>
    9. <filter-mapping>
    10. <filter-name>CharacterEncodingFilterfilter-name>
    11. <url-pattern>/*url-pattern>
    12. filter-mapping>
    13. 复制代码

    13、关于后缀名写法的一个说法

    • SpringMVC的默认的访问后缀就是.action

    • Struts1.x的时代 默认的访问后缀是.do

    • Struts2.x+的时代也变成了.action

  • 相关阅读:
    Python编程之子进程管理(subprocess)详解
    leetcode-二叉树的最近公共祖先-递归
    MyBatis之增删查改功能
    L4W4作业2 深度学习与艺术 - 神经风格迁移
    问题排查:nginx能跑,但是只能跑一会,不能跑多了
    对外提供服务的方法
    Pinia基础知识
    地图可视化:基于 Echarts + 百度地图bmap + 时间轴timeline + 多边形(multi)polygon + 点scatter 的可视化案例
    数组两种初始化方法
    Pytorch实现的LSTM、RNN模型结构
  • 原文地址:https://blog.csdn.net/Trouvailless/article/details/126116570