【SpringMVC】SpringMVC入门笔记1(近2w字)

SpringMVC入门笔记1



IDE: IntelliJ IDEA 2020.2

零 l  写在前面


1、以初学者的视角记录笔记
2、课程链接:[链接]
3、资料链接:[笔记对应课程的配套资料],提取码:invv
4、实操很重要!!!
5、本文主讲SpringMVC
6、前文链接:
[Spring入门笔记1][Spring入门笔记2][Spring入门笔记3]
[MyBatis入门笔记1][MyBatis入门笔记2]
[MVC设计模式简介]




一 l  简单介绍


Spring MVC是Spring提供的一个强大而灵活的web框架

借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。

这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。

Spring MVC主要由DispatcherServlet【配置文件】、处理器映射【找控制器】、适配器【调用执行控制器的方法】、控制器【业务】、视图解析器、视图组成。




二 l  SpringMVC快速入门


配套资料里面有完整的项目(java web项目),笔记会比较简略。

1、导包

四-一

2、配置web.xml(.\web\WEB-INF\web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- 配置:所有请求由SpringMVC管理 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

3、配置DispatcherServlet-servlet.xml(.\web\WEB-INF\DispatcherServlet-servlet.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- 1.配置url处理映射 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- 2.配置控制器处理适配器【找到控制器,这里是UserController】 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 3.配置控制器【配置了访问路径】 -->
    <bean name="/user.do" class="com.gyf.backoffice.web.controller.UserController"/>

    <!-- 4.配置资源视图解析器【解析控制器中传来的jsp】 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4、配置UserController.java(.\src\com\gyf\backoffice\web\controller\UserController.java)

public class UserController implements Controller{
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mav = new ModelAndView("user/userlist");
        mav.addObject("name","gyf");
        return mav;
    }
}

5、配置userlist.jsp(.\web\WEB-INF\views\user\userlist.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
</head>
<body>
${name}:<br>
用户列表
</body>
</html>

6、浏览器输入http://localhost/user.do测试

二-6

7、Spring的执行流程

二-7




三 l  DispatcherServlet-servlet.xml配置——URL处理器映射【了解】


DispatcherServlet-servlet.xml文件中使用的类

URL处理映射的方式有三种:【通过查找文件找到对应的控制器】

1、BeanNameUrlHandlerMapping(BeanNameUrl处理映射)

功能: 寻找Controller
具体: 根据url请求去匹配 对应name的bean ,从而获取Controller
示例:(示例访问:http://localhost/user.do)

<!-- 1.配置url处理映射 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
...
<!-- 3.配置控制器【配置了访问路径】 -->
<bean name="/user.do" class="com.gyf.backoffice.web.controller.UserController"/>
...

2、SimpleUrlHandlerMapping(简单的Url处理映射)

功能: 寻找Controller
具体: 根据浏览器url匹配简单url的key(示例中是"/user.do"),然后通过对应的value(示例中是userController),找到id是value的控制器
示例:(示例访问:http://localhost/user.do)

<!-- 1.配置url处理映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/user.do">userController</prop>
        </props>
    </property>
</bean>
...
<!-- 3.配置控制器【配置了访问路径】 -->
<bean id="userController" class="com.gyf.backoffice.web.controller.UserController"/>
...

3、ControllerClassNameHandlerMapping(控制器类名的处理映射)

功能: 寻找Controller
具体: 不用配置访问路径,通过类名(首字母小写).do访问

!!!重要!!!
其实是只截取了小写的url,匹配最相近:
UserController控制器可以使用user.do访问;
UserAddController控制器可以使用useradd.do访问;
UserController控制器和UserAddController控制器同时存在时,使用userAdd.do会访问UserController控制器,因为只截取了user,最匹配的就是UserController控制器。

示例:(示例访问:http://localhost/userController.do)

<!-- 1.配置url处理映射 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
...
<!-- 3.配置控制器【配置了访问路径】 -->
<bean class="com.gyf.backoffice.web.controller.UserController"/>
...





四 l  DispatcherServlet-servlet.xml配置——处理器适配器


配置控制器处理适配器:【配置如何调用控制器方法的方法】

两种处理适配器可以共存

1、SimpleControllerHandlerAdapter(简单控制器处理适配器)

功能: 执行controller
具体: 调用controller (实现Controller接口的类) 里面handleRequest方法,返回modelAndView
示例:

...
<!-- 2.配置控制器处理适配器【找到控制器,这里是UserController】 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
...

UserController.java(实现Controller接口的类)

public class UserController implements Controller{
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mav = new ModelAndView("user/userlist");
        mav.addObject("name","gyf");
        return mav;
    }
}

2、HttpRequestHandlerAdapter(http请求处理适配器)【了解】

功能: 执行controller
具体: 调用controller (实现HttpRequestHandler接口的类) 里面handleRequest方法,没有返回值
示例:

...
<!-- 2.配置控制器处理适配器【找到控制器,这里是HttpController】 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
...

HttpController.java(实现HttpRequestHandler接口的类)

public class HttpController implements HttpRequestHandler{
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name","gyf02");
        request.getRequestDispatcher("/WEB-INF/views/user/userlist.jsp").forward(request,response);
    }
}





五 l  DispatcherServlet-servlet.xml配置——命令控制器【了解】


SpringMVC通过命令设计模式接受页面参数。

1、User.java(.\src\com\gyf\backoffice\model\User.java)

public class User {
    // private Integer id;
    private String username;
    private String password;
    private String gender;
    private Date birthday;

    public User() {}
    
    public User(String username, int age, String gender, Date birthday) {
        this.username = username;
        this.age = age;
        this.gender = gender;
        this.birthday = birthday;
    }
    
    ...get、set、toString方法...
}

2、DispatcherServlet-servlet.xml(.\web\WEB-INF\DispatcherServlet-servlet.xml)

<!-- 1.配置url处理映射 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
...
<!-- 3.配置控制器【配置了访问路径】 -->
<bean name="/useradd.do" class="com.gyf.backoffice.web.controller.UserAddController"/>
<bean name="/command.do" class="com.gyf.backoffice.web.controller.CommandController"/>
...

3、UserAddController.java(.\src\com\gyf\backoffice\web\controller\UserAddController.java)

public class UserAddController implements Controller{
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mav = new ModelAndView("user/useradd");
        return mav;
    }
}

4、useradd.jsp(.\web\WEB-INF\views\user\useradd.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/command.do" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    性别:<input type="text" name="gender"><br>
    生日:<input type="text" name="birthday"><br>
    <input type="submit">
</form>
</body>
</html>

5、CommandController.java(.\src\com\gyf\backoffice\web\controller\CommandController.java)

public class CommandController extends AbstractCommandController {
    public CommandController(){
        //告诉springmvc把表单数据存在User模型里去
        this.setCommandClass(User.class);
    }
    @Override
    protected ModelAndView handle(HttpServletRequest requeset, HttpServletResponse response, Object o, BindException e) throws Exception {
        User user = (User) o;
        System.out.println(user);
        ModelAndView mav = new ModelAndView();
        mav.setViewName("user/info");
        mav.addObject("user",user);
        return mav;
    }
}

6、info.jsp(.\web\WEB-INF\views\user\info.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
显示表单提交的数据:
用户名:${user.username}<br>
密码:${user.password}<br>
</body>
</html>

7、POST请求乱码问题(.\web\WEB-INF\web.xml)
web.xml

<web-app>
    ...
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>





六 l  SpringMVC的注解开发【重要】


(一)注解配置快速入门

1、重新配置DispatcherServlet-servlet.xml(.\web\WEB-INF\DispatcherServlet-servlet.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- 注解配置控制器 -->
    <!-- 1.配置扫描包 -->
    <context:component-scan base-package="com.gyf.backoffice.web.controller"/>

    <!-- 2.配置注解处理映射 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <!-- 3.配置适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 4.配置资源视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2、重写UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    @RequestMapping("/list")
    public String list(Model model){
        return "user/userlist";
    }
}

3、在浏览器输入http://localhost/user/list.do测试

(二)RequestMapping配置请求路径、映射路径

1、自定义根路径:在类的最外面使用RequestMapping注解,可以添加根路径(此时使用http://localhost/user/list.do访问)

@Controller
@RequestMapping("/user")
public class UserController{
    @RequestMapping("/list")
    public String list(Model model){
        return "user/userlist";
    }
}

2、都是用http://localhost/list.do的注解配置法

@RequestMapping("list")
@RequestMapping("/list")

@RequestMapping("list.do")
@RequestMapping("/list.do")

@RequestMapping(value = "/list.do")

3、只能使用post方法下的http://localhost/list.do访问

@RequestMapping(value = "list", method = RequestMethod.POST)

4、只能使用get方法下的http://localhost/list.do访问

@RequestMapping(value = "list", method = RequestMethod.Get)

(三)接收请求参数

参数类型有:基本类型,int,String等等基本类型, Pojo类
Struts2参数:基于属性封装,在action会添加属性,提供set方法。
Springmvc参数封装:基于方法进行封装。

1、接收int、String、Date,数组类型(直接将参数作为函数输入)

UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    @RequestMapping("/toRegister")
    public String toRegister(){
        return "user/register";
    }
}

register.jsp(.\web\WEB-INF\views\user\register.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register.do" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    性别:<input type="text" name="gender"><br>
    年龄:<input type="text" name="age"><br>
    生日:<input type="text" name="birthday"><br>
    爱好:<input type="checkbox" name="hobbyIds" value="1">打球
    <input type="checkbox" name="hobbyIds" value="2">打人
    <input type="checkbox" name="hobbyIds" value="3">打假<br>
    <input type="submit">
</form>
</body>
</html>

UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    ...
    // 默认日期格式 月/日/年 10/10/2016
    @RequestMapping("/register")
    public String register(String username, String password,
                           Integer age, String gender, Date birthday,
                           String[] hobbyIds){
        System.out.println(username);
        System.out.println(password);
        System.out.println(age);
        System.out.println(gender);
        System.out.println(birthday);
        System.out.println(Arrays.toString(hobbyIds));
        return "user/info";
    }
    ...
}

2、接收pojo类型(将 参数 使用类的get/set方法 打包 成类作为函数输入)

User.java(.\src\com\gyf\backoffice\model\User.java)

public class User {
    private Integer id;
    private String username;
    private String password;
    private  int age;
    private String gender;
    private Date birthday;
    private  String[] hobbyIds;
    
    public User() {}
    public User(String username, int age, String gender, Date birthday) {
        this.username = username;
        this.age = age;
        this.gender = gender;
        this.birthday = birthday;
    }
    
    ...get、set、toString方法...
}

register.jsp(.\web\WEB-INF\views\user\register.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register2.do" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    性别:<input type="text" name="gender"><br>
    年龄:<input type="text" name="age"><br>
    生日:<input type="text" name="birthday"><br>
    爱好:<input type="checkbox" name="hobbyIds" value="1">打球
    <input type="checkbox" name="hobbyIds" value="2">打人
    <input type="checkbox" name="hobbyIds" value="3">打假<br>
    <input type="submit">
</form>
</body>
</html>

UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    ...
    @RequestMapping("/register2")
    public String register2(User user){
        System.out.println(user);
        return "user/info";
    }
    ...
}

3、接收包装类型参数(给扩展类中的user类传参数)

UserExt.java(.\src\com\gyf\backoffice\model\UserExt.java)

public class UserExt {
    private User user;
    ...get、set、toString方法...
}

register.jsp(.\web\WEB-INF\views\user\register.jsp)(注意属性加了"user."的前缀)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register3.do" method="post">
    用户名:<input type="text" name="user.username"><br>
    密码:<input type="text" name="user.password"><br>
    性别:<input type="text" name="user.gender"><br>
    年龄:<input type="text" name="user.age"><br>
    生日:<input type="text" name="user.birthday"><br>
    爱好:<input type="checkbox" name="user.hobbyIds" value="1">打球
    <input type="checkbox" name="user.hobbyIds" value="2">打人
    <input type="checkbox" name="user.hobbyIds" value="3">打假<br>
    <input type="submit">
</form>
</body>
</html>

UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    ...
    @RequestMapping("/register3")
    public String register3(UserExt userExt){
        System.out.println(userExt);
        return "user/info";
    }
    ...
}

4、接收集合List类型参数(给扩展类中的list传参数)

UserExt.java(.\src\com\gyf\backoffice\model\UserExt.java)

public class UserExt {
    private List<User> users = new ArrayList<User>();
    ...get、set、toString方法...
}

register.jsp(.\web\WEB-INF\views\user\register.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register4.do" method="post">
    用户名1:<input type="text" name="users[0].username"><br>
    密码1:<input type="text" name="users[0].password"><br>
    <hr>
    用户名2:<input type="text" name="users[1].username"><br>
    密码2:<input type="text" name="users[1].password"><br>
    <input type="submit" value="保存">
</form>
</body>
</html>

UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    ...
    @RequestMapping("/register4")
    public String register4(UserExt userExt){
        System.out.println(userExt.getUsers());
        return "user/info";
    }
    ...
}

5、接收集合Map类型参数(给扩展类中的map传参数)

UserExt.java(.\src\com\gyf\backoffice\model\UserExt.java)

public class UserExt {
    private Map<String,Object> infos = new HashMap<String,Object>();
    ...get、set、toString方法...
}

register.jsp(.\web\WEB-INF\views\user\register.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register5.do" method="post">
    用户名:<input type="text" name="infos['username']"><br>
    密码:<input type="text" name="infos['password']"><br>
    性别:<input type="text" name="infos['gender']"><br>
    年龄:<input type="text" name="infos['age']"><br>
    <input type="submit">
</form>
</body>
</html>

UserController(.\src\com\gyf\backoffice\web\controller\UserController.java)

@Controller
@RequestMapping("/user")
public class UserController{
    ...
    @RequestMapping("/register5")
    public String register5(UserExt userExt){
        System.out.println(userExt.getInfos());
        return "user/info";
    }
    ...
}

6、@RequestParam注解【重要】

@RequestParam:参数描述(可以说是参数限定)
value:参数名称
defaultValue:默认值
required:参数是否必须有值,如果为true,参数又为空,会报错

示例:(对名为uid的值进行设置,不允许为空,默认值为30)

@Controller
@RequestMapping("/user")
public class StudentController {
    @RequestMapping("/test")
    public String test2(@RequestParam(value="uid", required=true, defaultValue="30") Integer uid) {
        return "user/list";
    }
}

(四)Spring与Struts的区别

Struts2Springmvc
实现机制过滤器servlet
运行速度
单例多例多例
每一次请求,都会创建一个Action对象
请求来了以后,struts2创建以下对象:
ActionContext,valuestack,UAction,ActionSuport,ModelDriven
单例
同一个Controller请求,只会创建一个Controller
参数封装基于 属性 进行封装,Action有参数属性。基于 方法 封装,参数是写在Controller的方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值