1、功能介绍
入门程序,功能十分简单。输入一些数据,传到后端,后端打印数据,在此将该页面返回回来,供重新输入。
多次提交后,打印结果:
2、项目结构
项目结构很简单,就是一个简单的控制器MyController,一个页面index.jsp和一些配置文件。applicationContext是对容器的配置,由于本程序简单,并没有用到太多东西,所以是空的。dispatcher-servlet是spring-mvc的一些配置。web.xml是本web应用的配置。
3、pom.xml依赖
本程序用到了spring mvc和spring和servlet,所以依赖如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.luo.my</groupId>
<artifactId>springMVC</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springMVC Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>springMVC</finalName>
</build>
</project>
4、web.xml
在context-param中指定了spring配置文件的位置。配置了dispatcher的映射,映射为/,表示本web程序中所有的url都映射到dispatcher这个servlet上,整个请求过程都是由他规定的。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>My first springMVC project</display-name>
<!-- 配置Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 配置ContextLoaderListener用以初始化Spring IoC容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Servlet拦截配置 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5、applicationContext.xml
spring并不需要装载什么bean,因此为空。
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
6、dispatcher-servlet.xml
启动了和spring mvc相关注解的功能,设置了扫描包的路径,和定义视图解析器。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用注解驱动 -->
<mvc:annotation-driven/>
<!-- 定义扫描装载的包 -->
<context:component-scan base-package="com.luo.my"/>
<!-- 定义视图解析器 -->
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value = "/WEB-INF/jsp/" />
<property name = "suffix" value = ".jsp" />
</bean>
</beans>
7、MyController.java
使用@RequestMapping注解将commonParams映射到了“/”这个url上了,所以访问 localhost/springMVC/ 时将会调用这个函数。代码中将视图名设置成了index,因此会使用/WEB-INF/jsp/index.jsp这个文件作为视图返回。同时打印请求信息到控制台中。
package com.luo.my.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping("/")
public ModelAndView commonParams(String roleName,String note) {
ModelAndView mView=new ModelAndView();
mView.setViewName("index");
System.out.println("roleName:"+roleName);
System.out.println("note:"+note);
return mView;
}
}
8、index.jsp
注意要通过page设置编码,否则在其他程序中很容易造成乱码,因为他默认会使用iso-8859-1编码来发送程序。表单发送给 ./ 重新请求该文件。
<%@page contentType="text/html; charset=utf-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
<form action="./">
<label>角色名称</label>
<input name="roleName" />
<label>备注</label>
<input name="note"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
9、总结
springMVC程序中,主要要理解spring MVC处理请求的主要过程。当http请求到来时,由于配置了DispatcherServlet接收所有url,因此请求会被传到DispatcherServlet上,该servlet会根据handler mapping来找到url对应的控制器Controller,这个handler是通过注解@RequestMapping来配置的。Controller执行特定逻辑,生成模型(也就是数据)和找到合适视图,传送给DispatcherServlet。DispatcherServlet根据View Resolver找到视图对应的文件,比如视图名index对应/WEF-INF/jsp/index.jsp这个文件。View Resolver的配置是在dispatcher-servlet.xml中,里面定义了视图解析器。之后通过视图渲染模型到浏览器上。总的过程可以通过下面的一张过程图来秒速。