Spring Web MVC

本文详细阐述了SpringMVC框架的工作流程,包括请求处理、控制器组件、模型和视图的交互过程,以及如何配置DispatcherServlet和spring-mvc.xml文件。深入介绍了三种HandlerMapping配置方法和视图解析器的设置。
Spring Web MVC 工作流程
  1. 浏览器发出Spring MVC 请求,请求交给前端控制器 DispatcherServlet处理。
  2. 前端控制器通过 HandlerMapping 维护的请求和 Controller 解析信息,找到相应的Controller 组件处理请求。
  3. 执行Controller 组件的方法处理请求(Service 和DAO 层的操作),方法返回一个ModelAndView 对象,封装了模型数据和视图名称信息。
  4. 前端控制器接收 ModelAndView 之后,调用视图解析器 ViewResolver 组件, 定位View和JSP,并传递Model信息,生成响应页面
配置 DispatcherServlet

我们使用SpringMVC框架,首先要在web项目的web.xml中配置前端控制器。

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器等等) 
    如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml
    -->
    <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>DispatcherServlet</servlet-name>
    <!-- 第一种: *.action 访问以.action结尾的DispatcherServlet进行解析
        第二种/:,所有访问地址都有DispatcherServlet进行解析,对于静态文件的解析我们需要配置不让DispatcherServlet进行解析
        第三种:/*
       -->
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>

spring-mvc.xml内的一些配置

配置 HandlerMapping 三种方式
<!-- 1.按照controller的name来映射寻找controlller,默认存在的 -->
	    <bean id="userController" name="/user.do"
		   class="controller.UserController" />
		<bean class ="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping ">
		</bean>
<!-- 2.根据控制类的类名访问Controller,访问时类的类名需要小写(加不加.do均可)-->
	        <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
            <bean class="controller.UserController"></bean>
<!-- 3.根据简单URL查找Controller-->
             <bean id="userMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
			        <property name="mappings">
			            <props>
			                <prop key="/user">userController</prop>
			            </props>
			        </property>
              </bean>
              <bean id="userController" class="controller.UserController"></bean>
	
配置 ViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">      
   <property name="prefix" value="/WEB-INF/jsp/" />       
   <property name="suffix" value=".jsp" />      
</bean>   

扫描控制器层
        <context:component-scan
			base-package="controller.UserController">
			<context:include-filter type="annotation"
				expression="org.springframework.stereotype.Controller" />
		</context:component-scan>
<!--注解驱动,以使得访问路径与方法的匹配可以通过注解配置 -->
		<mvc:annotation-driven />

Controller类

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import entity.User;

/**
 * UserController 是一个基于注解的控制器
 * 可以同时处理多个请求动作
 */
@Controller
public class UserController {
    
    /**
    * RequestMapping 用来映射一个请求和请求的方法
    * value="/register" 表示请求register页面由这个方法进行处理
    */
    @RequestMapping(value="/register")
    public String Register(@ModelAttribute("form") User user, Model model) {  // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象
        System.out.println("太难了,终于进了Controller类");
    	// 在 model 中添加一个名为 "user" 的 user 对象
        model.addAttribute("user", user);
        // 返回一个字符串 " success" 作为视图名称
        return "success";
    }
}

实体类 User

package entity;
import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    private Integer id;
    private String username;
    private String password;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

spring-mvc.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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
        
        <!--注解驱动,以使得访问路径与方法的匹配可以通过注解配置 -->
		<mvc:annotation-driven />
		
		<!-- 扫描controller层 -->
		<context:component-scan
			base-package="controller.UserController">
			<context:include-filter type="annotation"
				expression="org.springframework.stereotype.Controller" />
		</context:component-scan>
		
		<!-- 1.按照controller的name来映射寻找controlller,默认存在的 -->
	    <!-- <bean id="userController" name="/user.do"
		   class="controller.UserController" />
		<bean class ="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping ">
		</bean> -->
		
		 <!-- 2.根据控制类的类名访问Controller,访问时类的类名需要小写(加不加.do均可)-->
	        <!-- <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
            <bean class="controller.UserController"></bean> -->
            
          <!--方式一  根据简单URL查找Controller-->
             <bean id="userMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
			        <property name="mappings">
			            <props>
			                <prop key="/user">userController</prop>
			            </props>
			        </property>
              </bean>
              <bean id="userController" class="controller.UserController"></bean>
              
          <!-- 配置视图解析器 -->
			<bean
				class="org.springframework.web.servlet.view.InternalResourceViewResolver">
				<property name="prefix" value="/WEB-INF/views/"></property>
				<property name="suffix" value=".jsp"></property>
			</bean>
</beans>
register.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>登录页面</title>
</head>
<body>
    <form action="register" method="post">
        <h5>登录页面</h5>
        <p>
            <label>用户名: </label> <input type="text" id="username" name="username"
                tabindex="1">
        </p>

        <p>
            <label>密码: </label> <input type="text" id="password" name="password"
                tabindex="2">
        </p>

        <p>
            <label>年龄: </label> <input type="text" id="age" name="age"
                tabindex="3">
        </p>
        <p id="buttons">
            <input id="submit" type="submit" tabindex="4" value="登录">
            <input id="reset" type="reset" tabindex="5" value="取消"> 
        </p>
    </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>登录成功</title>
</head>
<body>
    <h5>登录成功</h5>
    <p>
        用户名:${requestScope.user.username}<br /> 密码:${requestScope.user.password}<br /> 年龄:${requestScope.user.age}<br />
    </p>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SpringMVC</display-name>
  
  <!-- 前端控制器 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!-- 欢迎页面 -->
  <welcome-file-list>
    <welcome-file>register.jsp</welcome-file>
  </welcome-file-list>
</web-app>

完整项目下载 :
github:https://github.com/MurphySecret/SpringMvc.git

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值