一、使用SpringMVC进行环境搭建

1、SpringMVC是Spring框架中用于Web应用开发的一个模块

,基于MVC设计模式的优秀Web开发框架,本质相当于Servlet,SpringMVC作为控制器,来建立模型与视图的数据交互,是一个典型的MVC框架。

2、Struts2MVC 和SpringMVC相比,为什么SpringMVC应用更加广泛??

SpringMVC在框架设计,扩展性,灵活性等方面更强大。

3、搭建环境

(1)、创建动态工程SpringMVC42,勾选上添加xml文件。添加相关jar包
(2)、打开web.xml文件,配置Servlet相关文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 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">
  3. <display-name>SpringMVC42</display-name>
  4. <!--
  5. <welcome-file-list>
  6. <welcome-file>index.jsp</welcome-file>
  7. </welcome-file-list>
  8. -->
  9. <!-- 1.配置Servlet -->
  10. <servlet>
  11. <servlet-name>springmvc</servlet-name>
  12. <servlet-class>
  13. org.springframework.web.servlet.DispatcherServlet
  14. </servlet-class>
  15. <!-- 2.加载配置文件 -->
  16. <init-param>
  17. <param-name>contextConfigLocation</param-name>
  18. <param-value>classpath:springmvc-servlet.xml</param-value>
  19. </init-param>
  20. <!--3. 加载次序(优先级) -->
  21. <load-on-startup>1</load-on-startup>
  22. </servlet>
  23. <!-- 4. -->
  24. <servlet-mapping>
  25. <servlet-name>springmvc</servlet-name>
  26. <url-pattern>/</url-pattern>
  27. </servlet-mapping>
  28. </web-app>

扩展:有时候报错需要查看文件是否被编译
查看:window—》show View —-》Navigator
运行自动编译:project—》Build Automatically
(3)、创建SpringMVC-Servlet.xml文件,SpringMVC的配置文件。
首先配置头文件,然后在WEB-INF下建jsp文件夹

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/mvc
  13. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  14. <!-- 1、视图解析器/映射器 URL地址拼接,不需要全部输入 prefix前缀;suffix后缀-->
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/jsp/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>
  19. <!-- 2.name值是URL的请求地址;class是控制器类的全路径名 -->
  20. <bean name="/index.html" class="cn.smbms.controller.IndexController"></bean>
  21. </beans>

(4)、src下创建包—-》cn.smbms.controller包——》建IndexController类

  1. package cn.smbms.controller;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.web.servlet.ModelAndView;
  5. import org.springframework.web.servlet.mvc.AbstractController;
  6. //与实现servlet类似
  7. public class IndexController extends AbstractController {
  8. @Override
  9. protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
  10. System.out.println("进没进这个方法,看是否输出");
  11. return new ModelAndView("index");
  12. }
  13. }

jsp包下创建index.jsp文件,放入标签,然后打开网页输入SpringMVC42/index.html测试

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <h1>hello,SpringMVC!</h1>
  11. </body>
  12. </html>

4、当出现多个请求的时候,如何改进?

通过注解的方式,进行SpringMVC开发
首先,注掉springmvc-servlet中的第二条,然后添加注解的方法实现多个控制器映射

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/mvc
  13. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  14. <!-- 1、视图解析器/映射器 URL地址拼接,不需要全部输入 prefix前缀;suffix后缀-->
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/jsp/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>
  19. <!-- 2.name值是URL的请求地址;class是控制器类的全路径名
  20. <bean name="/index.html" class="cn.smbms.controller.IndexController"></bean>
  21. -->
  22. <!-- 3.如果存在多个请求, 使用注解方法 实现多个控制器映射 -->
  23. <context:component-scan base-package="cn.smbms"></context:component-scan>
  24. <mvc:annotation-driven></mvc:annotation-driven>
  25. </beans>

新建index2Controller类,用注解@Controller和@RequestMapping(“”)

  1. package cn.smbms.controller;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.servlet.ModelAndView;
  11. import cn.smbms.pojo.UserParam;
  12. @Controller
  13. //用作模块的划分,便于权限的管理
  14. @RequestMapping("/idx")
  15. public class Index2Controller {
  16. Logger log = Logger.getLogger(Index2Controller.class);
  17. //请求地址
  18. @RequestMapping("/index2.html")
  19. public String index2(){
  20. log.info("是否进入这个方法");
  21. return "index2";
  22. }
  23. }

新建index2.jsp界面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <h1>index2</h1>
  11. </body>
  12. </html>

在网页中输入网址http://127.0.0.1:8080/SpringMVC42/idx/index2.html实现显示

标签的index2

5、重点

(1)、SpringMVC构架的请求处理流程

QQ图片20210526195203.jpg

(2)、SpringMVC架构的体系结构

SpringMVC体系结构和处理请求控制器 - 图2
模型图解
QQ图片20210526195932.jpg
详解:
1、客户端发出http请求,web应用服务器接收此请求。若匹配DispatcherServlet的请求映射路径(在web.xml中指定),则web容器将该请求转交给DispatcherServlet处理。
2、DispatcherServlet接收到请求后,将根据请求的信息(包括URL,请求参数,http方法等)及HandlerMapping的配置(在-servlet.xml中配置)找到处理请求的处理器(Handler)
3、当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler,HandlerAdapter可以理解为具体使用Handler来干活的人,HandlerMapping接口里一共有三个方法,supports(Object);handler(HTTPServletRequest,HTTPServletResponse,Object);getLastModified(HTTPServletRequest,Object)
4、在请求信息到达真正调用handler的处理方法之前的这段时间,SpringMVC还完成了很多工作,它会将请求信息以一定的方式转换并绑定到请求方法的入参中,对于入参的对象会进行数据转换、数据格式化以及数据校验等操作。这些都做完才真正的调用Handler的处理方法进行相应的业务逻辑处理。
5、处理器完成业务逻辑处理之后,将返回一个ModelAndView对象给DispatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息
6、ModelAndView 对象中包含的是“逻辑视图名”,而非真正的视图对象。DispatcherServlet会通过ViewResolver将逻辑视图名解析为真正的视图对象View。当然,负责数据展示的视图可以是JSP、XML、PDF、JSON等多种数据格式,对此SpringMVC均可灵活配置。
7、当得到真实的视图对象View后,DispatcherServlet会使用ModelAndView对象中的模型数据对View进行视图渲染
8、最终客户端获得响应信息,可以是普通的HTML页面,也可以是一个XML或者JSON格式的数据等

6、前端往后端传值

index3

1、在index2Controller类中建index3传参方法,创建index3.jsp页面,在网页中打开。
在index3的方法中传入String name 参数,在url地址后面加上?name=toto,可在控制台上看打印结果
2、如果参数是String name1,只需要在前面加@RequestParam(value= “name”),这样就将参数name1和url中参数name映射到一起;
3、url参数想传就传,不想传就不传,只要新加属性required=false;//value参数名,required表示参数是否必须传递,默认为true(必须传递)
http://127.0.0.1:8080/SpringMVC42/idx/index3.html?name=toto
image.png

index4

4、传多个参数,详见index4
http://127.0.0.1:8080/SpringMVC42/idx/index4.html?name=toto&age=18
image.png

  1. package cn.smbms.controller;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.servlet.ModelAndView;
  11. import cn.smbms.pojo.UserParam;
  12. @Controller
  13. //用作模块的划分,便于权限的管理
  14. @RequestMapping("/idx")
  15. public class Index2Controller {
  16. Logger log = Logger.getLogger(Index2Controller.class);
  17. //请求地址
  18. @RequestMapping("/index2.html")
  19. public String index2(){
  20. log.info("是否进入这个方法");
  21. return "index2";
  22. }
  23. //SpringMVC传参
  24. @RequestMapping("/index3.html")
  25. //value参数名,required表示参数是否必须传递,默认为true(必须传递)
  26. public String index3(@RequestParam(value="name",required=false)String name1){
  27. System.out.println(name1);
  28. return "index3";
  29. }
  30. //传递多个参数
  31. @RequestMapping("/index4.html")
  32. public String index4(String name,Integer age){
  33. System.out.println(name);
  34. System.out.println(age);
  35. return "index4";
  36. }
  37. }
  38. index3.jsp:
  39. <%@ page language="java" contentType="text/html; charset=UTF-8"
  40. pageEncoding="UTF-8"%>
  41. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  42. <html>
  43. <head>
  44. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  45. <title>Insert title here</title>
  46. </head>
  47. <body>
  48. <h1>index3</h1>
  49. </body>
  50. </html>
  51. index4.jsp:
  52. <%@ page language="java" contentType="text/html; charset=UTF-8"
  53. pageEncoding="UTF-8"%>
  54. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  55. <html>
  56. <head>
  57. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  58. <title>Insert title here</title>
  59. </head>
  60. <body>
  61. <h1>index4</h1>
  62. </body>
  63. </html>

7、从后端往前端传值

index5

1.index5,后端设置name名,前端jsp${name}获取到name并显示;传英文或者中文都可以。

//后端往前段传参数
    //第一种
    @RequestMapping("/index5.html")
    public ModelAndView index5(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("name","韩美米");
        //返回的视图名,跳转到哪个界面
        mav.setViewName("index5");
        return mav;
    }

<!-- 后端往前端传,传普通类型 -->
    <h1>index5 -> ${name}</h1>

http://127.0.0.1:8080/SpringMVC42/idx/index5.html
image.png

index6

2、index6,Model方法,由于跳转到index5,所以index5.jsp修改一下。
在网页打开index6.html;并加参数?name=toto
3、传对象,传实体对象,在cn.smbms下建pojo包,创建UserParam类;在Index2Controller中修改index6,和index5.jp

package cn.smbms.pojo;
//传递对象的方式
public class UserParam {
    private String name;
    private Integer age;
    public UserParam(){

    }
    public UserParam(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}
//第二种
    @RequestMapping("/index6.html")
    public String index6(String name,Model model){
        //传对象类型
        UserParam up = new UserParam("张三",18);
        model.addAttribute("key1",name);
        model.addAttribute("key2",up);
        return "index5";
    } 
//jsp界面
    <h1>index6 -> ${key1}</h1>
    <!-- 后端往前端传,传对象类型 -->
    <h1>index6 -> ${key2.name}--${key2.age}</h1>

http://127.0.0.1:8080/SpringMVC42/idx/index6.html?name=toto
image.png

index7

第三种,Index2Controller中加入index7方法,传入Map型参数;index5.jsp中修改

//第三种
    @RequestMapping("/index7.html")
    public String index7(Map<String, Object> map){
        List<UserParam> list = new ArrayList<UserParam>();
        list.add(new UserParam("李雷",12));
        list.add(new UserParam("韩梅梅",15));
        map.put("key3", list);
        return "index5";

    }
//index5.jsp
<!-- 后端往前端传,传复杂类型 Map,List,对象 -->
    <h1>index7 -> ${key3[0].name}--${key3[0].age}|${key3[1].name}--${key3[1].age}</h1>

http://127.0.0.1:8080/SpringMVC42/idx/index7.html
image.png

8、练习3,完成View和Controller之间的参数传递

(1)、实现View和Controller之间的参数传递
(2)、在用户界面index8.jsp,提供输入型text框,输入用户编码userCode。
(3)、提交后跳转到success.jsp网页显示,显示输入的userCode
(4)、要求在控制台输出从前台获取的userCode的值

index2Controller类
//上机练习213页,前-》后-》前
    @RequestMapping("/index8.html")
    public String index8(String userCode){
        return "index8";
    } 
    @RequestMapping("/test.html")
    public String success(Map<String, Object> map,String userCode){
        System.out.println(userCode);
        map.put("userCode", userCode);
        return "success";
    }
index8.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/SpringMVC42/idx/test.html">
        <input type="text" name="userCode" id="userCode"/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>${userCode}</h1>
</body>
</html>

image.png
image.png
image.png
image.png