SpringMVC

SpringMVC

(1)SpringMVC是什么?

为了简化基于MVC架构的web应用程序的开发而推出的一个框架。 SpringMVC是Spring整个大的框架的一部分。

(2)SpringMVC的五大组件
a.DispatcherServlet 前端控制器
b.HandlerMapping 映射处理器
c.Controller 处理器
d.ModelAndView 存放处理结果
e.ViewResolver 视图解析器

(3)五大组件的关系:
**step1.**DispatcherServlet负责接收请求,收到请求之后,依据
HandlerMapping的配置调用对应的Controller来处理。
**step2.**Controller返回处理结果(处理结果会封装成一个Model
AndView对象)给DispatcherServlet。
**step3.**DispatcherServlet依据ViewResolver的解析,调用对应的
jsp。
在这里插入图片描述
 (4)编程步骤
**step1.**导包。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>3.2.8.RELEASE</version>
</dependency>

**step2.**添加Spring的配置文件。
**step3.**配置DispatcherServlet。(web.xml)

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
         org.springframework.web.servlet.DispatcherServlet
</servlet-class>

<!--
         DispatcherServlet在执行初始化方法时,
         会启动Spring容器,所以,需要知道Spring
         配置文件的位置。
         contextConfigLocation用于指定Spring配置
         文件的位置。
 -->
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

**step4.**添加Controller类。

public class HelloController implements Controller{

public ModelAndView handleRequest(
        HttpServletRequest request, 
        HttpServletResponse response) 
                throws Exception {
    System.out.println(
            "HelloController的handleRequest方法");
    /*
     * ModelAndView用来封装处理结果。
     * 该类有两个构造器:
     * ModelAndView(String viewName)
     * ModelAndView(String viewName,Map data)
     * 注:
     *      viewName:视图名。
     *      data:数据。
     */
    return new ModelAndView("hello");
    }
}

**step5.**添加jsp。
**step6.**在Spring配置文件里面,配置HandlerMapping、ViewResolver。

<!-- 配置映射处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/hello.do">helloController</prop>
        </props>
    </property>
</bean>
<bean id="helloController" 
class="controller.HelloController"/>

<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/"/>
    <property name="suffix" value=".jsp"/>
</bean>

(5)执行过程
在这里插入图片描述

作用

SpringMVC解决了V与C的交互问题。

在传统的基于Servlet的编程中,最大的问题在于每个Servlet只用于处理1种请求,例如某Servlet只处理注册请求,而登录功能则需要另一个Servlet,同理,退出登录、修改资料、修改密码等等功能都需要有对应的Servlet,随着项目的功能的增加,所需的Servlet的数量就会越来越多,也会导致:项目运行时,有大量的Servlet占用了服务器的内存空间!
所以,在SpringMVC中,只使用了1个DispatcherServlet去接收所有的请求,然后进行分发到不同的Controller中的某个方法,从而,减少Servlet对象的数量!
SpringMVC还提高了编码效率。

开发流程

创建项目

创建Maven Project,勾选Create a simple project,然后,Group Id通常填当前项目的根包,例如cn.tedu.spring,Artifact Id可以使用项目名称,例如SPRINGMVC-01-HELLOWORLD,Packaging选择war,然后点击Finish,以创建项目。
默认创建的项目中并不包含web.xml文件,所以,必须生成该文件,避免项目报错。
在pom.xml中添加spring-mvc的依赖代码:

   <dependencies>
    
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.2.8.RELEASE</version>
        </dependency>

</dependencies>

然后,添加Tomcat运行环境。
然后,复制此前项目中的Spring配置文件spring-mvc.xml到当前项目中,并删除已有的配置代码,除非你确定那些代码是你需要的。
所以,以后每次创建新的项目后,都应该:1) 生成web.xml,2) 添加依赖,3) 添加Tomcat运行环境,4) 复制Spring配置文件。

配置web.xml

因为在SpringMVC中,使用了DispatcherServlet接收所有的请求,然后再分发出去,所以,首先必须配置DispatcherServlet,使得它能初始阶段就运行,并接收所有请求!
即使使用了框架,核心技术其实是没有发生变化的,所以,既然要配置DispatcherServlet,就必须在web.xml中添加配置:

<!-- 配置是哪个Servlet -->
<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 当Servlet被初始化时加载Spring配置文件 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 当Tomcat启动时就初始化当前Servlet -->
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- 配置Servlet对应的请求路径 -->
<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

以上代码中,以后可能调整的有:classpath:springmvc.xml中Spring配置文件的文件名;.do中接收的请求的名称。
当以上配置完成后,应该:当Tomcat启动时,就会初始化DispatcherServlet,用于接收.do请求,当DispatcherServlet被初始化时,就会加载Spring的配置文件!

设计目标

希望发出的请求路径是/login.do,并且,显示出webapp/WEB-INF/login.jsp。

控制器

在改进的做法中,不必再配置HandlerMapping!
处理请求的一定是控制器,所以,创建控制器类:cn.tedu.spring.controller.UserController,即希望所有关于用户的操作的请求,都交给这个控制器来处理!控制器类都应该是整个项目的关键组件,是应该交给Spring进行管理的,所以,使用@Controller注解这个类,并且,在Spring的配置文件中,添加组件扫描。
注意:这种做法不需要实现Controller接口!并且,处理请求的方法可以自行定义返回值类型、方法名称、参数列表!
此次的目标是显示登录页面,所以,方法名可以是showLogin,由于不需要参数,所以,方法的参数列表为空,处理结束时,不需要转发任何数据,只需要确定视图组件名称即可,所以,返回值类型设计为String。

public String showLogin() {
    return "login"; // WEB-INF/login.jsp
}

最后,为了确保/login.do请求能够被这个方法来处理,需要为这个方法添加注解:

@RequestMapping("login.do")
public String showLogin() {
    return "login"; // WEB-INF/login.jsp
}

添加注解后,就产生了请求路径与方法的映射关系。即:当接收到login.do请求后,就会调用以上showLogin()方法!
视图解析器

在Spring的配置中添加关于视图解析器的配置:

<!-- 配置视图解析器:根据视图名称得到视图资源 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置前缀 -->
    <property name="prefix" value="/WEB-INF/" />
    <!-- 配置后缀 -->
    <property name="suffix" value=".jsp" />
</bean>

创建视图组件

由于视图解析器配置的前缀是/WEB-INF/,后缀是.jsp,而控制器返回的视图名称是login,所以,此次响应的视图组件应该是/WEB-INF/login.jsp,所以,在/WEB-INF/下创建名为login.jsp的文件即可完成响应。

常见问题

问题描述:

警告: No mapping found for HTTP request with URI [/SPRINGMVC-02-REQUESTMAPPING/login1.do] in DispatcherServlet with name 'SpringMVC'

**问题原因:**没有找到请求路径对应的映射,无法处理这个URI对应的请求!
解决方法:

• 请检查控制器类是否被Spring管理,即:在Spring配置中是否开启了组件扫描,且扫描的位置是否是控制器类的包名或其父级包名!并且,控制器类是否添加了@Controller注解!
• 请检查是否正确的配置了@RequestMapping,即:在@RequestMapping中填写的请求路径,与浏览器地址栏中输入的路径需要保持完全一致,包括.do后缀!
• 请检查web.xml中配置的DispatcherServlet接收的请求映射,应该是*.do!

关于@RequestMapping注解

基本使用
使用@RequestMapping可以配置请求路径与处理请求的方法之间的映射关系!
使用@RequestMapping可以修饰方法,也可以修饰类!即:在类的声明之前也可以添加该注解,例如:

@Controller
@RequestMapping("user")
public class UserController {

    @RequestMapping("login.do")
    public String showLogin() {
        return "login";
    }

}

则访问时的请求路径应该是:user/login.do
所以,同样是使用@RequestMapping注解,在类之前加的注解并不能取代方法之前的注解!如果在类和方法之前都添加了该注解,其实是组合使用的!
通常,建议在每个控制器类之前都使用@RequestMapping进行注解!
在配置注解时,其中的路径可以添加/,也可以不添加,也就是:
/user /login.do
/user login.do
user /login.do
user login.do
以上4种做法都是可以正确运行的!推荐使用第1种,也就是类和方法之前的注解都添加/。

接收请求参数

设计目标

在reg.jsp中添加用户名和密码的输入框,当点击提交按钮后,以POST的方式将请求提交到/user/handle_reg.do,并且 ,控制器接收到请求后,能够获取用户填写的用户名和密码。

【不推荐】通过HttpServletRequest参数获取请求参数

在处理请求的方法中,添加HttpServletRequest类型的参数,然后调用参数对象的String getParameter(String)方法即可获取请求参数:

 @RequestMapping("/handle_reg.do")
    public String handleReg(HttpServletRequest request) {
        System.out.println("UserController.handleReg() > 准备接收请求参数...");

    // getParameter()的参数必须与jsp页面中控件的name保持一致
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username=" + username);
    System.out.println("password=" + password);

    return ""; // 暂不关心返回的视图名,后续运行会出现404
}

【推荐】直接在处理请求的方法中声明所需的参数

将所需的参数列表直接添加在处理请求的方法中即可:

public String handleReg(String username, String password, 
        Integer age) {
    System.out.println("UserController.handleReg() > 准备接收请求参数...");

    // getParameter()的参数必须与jsp页面中控件的name保持一致
    System.out.println("username=" + username);
    System.out.println("password=" + password);
    System.out.println("age=" + age);

    return "a"; // 暂不关心返回的视图名,后续运行会出现404
}

使用这种做法,无须调用HttpServletRequest对象的getParameter()方法,甚至都不需要考虑类型转换问题,例如所需的age是Integer类的,则直接声明参数Integer age即可,SpringMVC框架会自动的转换类型!
注意:使用这种做法,必须前后端使用的名称保持一致,例如前端页面中 标签的name值是username,则后端控制器的方法中的参数名称也必须是username,如果不一致,则后端控制器获取到的值将是null值!
注意:
如果前端页面没有输入值,则控制器接收到的是空字符串,即"",如果前端页面根本就没有提交这个名称的参数,则控制器接收到的是null!
由于前后端可能是不同的开发团队完成的,则很可能出现名称不一致的问题,针对这种问题,可以在参数之前添加@RequestParam(“前端提交的参数名”)来解决:

@RequestMapping("/handle_reg.do")
public String handleReg(
        @RequestParam("username") String name, 
        String password, Integer age) {
    System.out.println("UserController.handleReg() > 准备接收请求参数...");

    // getParameter()的参数必须与jsp页面中控件的name保持一致
    System.out.println("name=" + name);
    System.out.println("password=" + password);
    System.out.println("age=" + age);

    return "a"; // 暂不关心返回的视图名,后续运行会出现404
}

注意:当添加了@RequestParam()注解后,该参数默认是必须提交的,如果没有提交,则报错,该问题后续在@RequestParam专题中详解。

【推荐】使用自定义的数据类型接收请求参数
可以自定义某个数据类型,对应所有的请求参数:

public class User {

    private String username;
    private String password;
    private Integer age;

    // ...
}

然后,在处理请求的方法中,直接将这个类型作为参数即可:

@RequestMapping("/handle_reg.do")
public String handleReg(User user) {
    System.out.println(user);
    return null;
}

注意:使用这种做法也必须保证提交的参数名称,与自定义类型中的属性名称,必须保持一致!如果没有保持一致,则获取到的对象的那些属性将是null值!

小结

在SpringMVC中,处理请求时,有3种方式可以接收请求参数,实际使用的有:直接声明同名参数、使用自定义数据类型,如果有必要的话,这2种方式可以组合使用!
当使用同名参数接收请求参数时,如果名称不一致,可以使用@RequestParam()注解来确定请求参数的名称。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值