目录
简介
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。
MVC框架共同特征
看一下这几个问题:
怎么进行请求分发(url定位到一个Java类的方法)?
表单参数如何获取?
如何跳转到对应的页面?
跳转到页面时怎么传递参数?
Springmvc示例
1、搭建环境,创建maven项目
完善目录结构
添加坐标依赖
<!-- springMVC核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- 日志文件管理包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
强制发布到tomcat上,不加可能会产生类找不到的错
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
log4j.properties
### 日志级别 目的地 ###
log4j.rootLogger=debug, stdout,logfile
### 控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### 文件 第二行是文件名称###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=log4j.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
整合好的jar
2、创建springmvc配置文件,springMVC-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: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-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 添加springmvc扫描器 -->
<context:component-scan base-package="cn.sdut.demo"/>
</beans>
3、配置web.xml文件(通过前端核心控制器,加载springMVC-servler.xml配置文件)
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC-servlet.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
4、添加测试页面
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<style>
.body{
width: 300px;
margin: 10px auto;
border: 1px solid blue;
padding: 40px;
}
input{
margin-top: 10px;
margin-bottom: 10px;
}
.input{
text-align: center;
}
</style>
</head>
<body>
<div style="text-align: center;margin-top: 140px;font-size: larger;font-family: 微软雅黑">登 录</div>
<div class="body">
<form action="login.do" method="post" >
<div class="input">账 户:<input type="text" name="username" value="admin"/><br/></div>
<div class="input">密 码:<input type="password" name="password" value="admin"/><br/></div>
<div class="input"><input type="submit" value=" 提 交 "/></div>
</form>
</div>
</body>
</html>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
<h2>欢迎${username}登录成功!</h2>
</body>
</html>
5、控制器LoginController
package cn.sdut.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @author:hydra
* @date:2019/12/3
*/
@Controller
public class LoginController {
@RequestMapping("login.do") // 取 接受前端参数
public String login(@RequestParam("username") String user, String password, ModelMap map){
//参数名不同时可以使用RequestParam
// 调 模拟调用服务层方法
if (password.equals("admin")){
// 存 存入会话域中
map.put("username",user);
}
// 转 跳转页面
return "forward:index.jsp";
}
}
6、运行程序
Spring Web MVC处理请求的流程(执行原理)
核心原理具体执行步骤如下:
- 用户发送请求给服务器。url:login.do
- 服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。
- DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则通过HangdlerAdapter调用Controller。
- Controller开始执行。
- Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。
- DispatchServlet将执视图对象中的数据,输出给服务器。
- 服务器将数据输出给客户端。
SpringMVC的优点
- Spring MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多。
- Spring MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)
- Spring MVC的灵活是你无法想像的,Spring框架的扩展性好,Spring MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制
- 站在巨人的肩膀上成功的
SpringMVC解决中文乱码
在web.xml配置过滤器
<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>
常见注解
@Controller
- spring中的注解,代表控制层
- 配置文件加载时回new Bean
@RequestMapping
- 配置请求的映射
@RequestParam
- 页面的name属性属性与方法的参数名不一致时指明
@SessionAttributes
- 将Model或者ModelMap中指定的属性放到session中
@ModelAttribute
- 注解void返回值的方法
- 定义一次,使用多次
看个例子
User接口
controller层从前端接受参数,存入session域和request域中
@Controller
@SessionAttributes({"users"})/*将users对象放到session中*/
public class LoginController {
/*注解返回值为void的方法,直接一次,使用多次*/
@ModelAttribute
public void populateModel(User user, Model model){
user.setDate(new Date());
model.addAttribute("users",user);
}
@RequestMapping("login.do") // 取 接受前端参数
public String login(/*@RequestParam("username") String user, String password, ModelMap map*/){
//参数名不同时可以使用RequestParam
// 调 模拟调用服务层方法
/* if (password.equals("admin")){
// 存 存入会话域中
map.put("username",user);
}*/
// 转 跳转页面
return "index";
}
}
取参数
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
<h2>欢迎${sessionScope.users}登录成功!</h2>
<h2>欢迎${requestScope.users}登录成功!</h2>
</body>
</html>
源码
提取码: b75u