SpringMVC配置及使用
1、什么是SpringMVC
SpringMVC是web层的一个MVC框架,类似于struts2
2.SpringMVC的基本配置和常见使用
2.1 基于xml的配置
SpringMVC所需要的jar包
上传本次例子的目录
在介绍springmvc的配置之前,先来看看springmvc的执行流程
上图揭示了springmvc的执行流程,也就是一个响应从发出到解析的过程。上述的前端控制器、处理器映射器、处理器适配器、视图解析器,在不同的xml文件中进行配置,接下来,贴出web.xml和springmvc.xml文件以及自定义的controller以及jsp视图
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>2018springMVC</display-name>
<!--
将编码与解码操作放入拦截器,便于在拦截时不会出现乱码情况
-->
<filter>
<filter-name>characterEncoding</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>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
配置springmvc的DispatcherServlet
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 默认加载方式
默认加载必须规范:
* 文件命名:servlet-name-servlet.xml====springmvc-servlet.xml
* 路径规范:必须在WEB-INF目录下面
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- 拦截.do结尾的响应 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
springmvc.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">
<!-- 配置处理器映射器,springmvc默认的处理器映射器
BeanNameUrlHandlerMapping:根据bean(自定义Controler)的name属性的url去寻找hanler(Action:Controller)
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 定义通过: 类名.do 形式来访问controller -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
<!-- 配置处理器适配器执行Controlelr ,springmvc默认的
SimpleControllerHandlerAdapter:执行Controller
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 配置自定义Controller -->
<bean id="myController" name="/hello.do" class="com.mec.web.controller.MyController"></bean>
<!-- 配置springmvc视图解析器:解析逻辑试图
后台返回逻辑试图:index
视图解析器解析出真正物理视图:前缀+逻辑试图+后缀
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- <property name="prefix" value="/WEB-INF/jsps/"></property> -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
Mycontroller
public class MyController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// 接受请求,接受参数,验证参数
//封装参数,调用业务方法
//返回视图
ModelAndView mv = new ModelAndView();
//设置页面回显数据
mv.addObject("hello", "welcome to springmvc!");
//指定跳转的视图
//返回物理视图
//mv.setViewName("/WEB-INF/index.jsp");
//返回逻辑视图
mv.setViewName("index");
return mv;
}
}
index.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>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login.do" method="post">
用户名:<input type="text" id="id" name="id"/><br/>
密码:<input type="password" id="password" name="password"/><br/>
<input type="submit" value="登录"/><br/>
</form>
${hello } //观察Mycontroller中的红色字体,此处与之对应
</body>
</html>
最后展现出结果
2.2 基于注解的配置
注解配置方式在开发过程中是最常见的,与xml配置十分类似,将springmvc.xml文件进行改动后,就可以使用注解配置
springmvc.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">
<context:component-scan base-package="com.mec"></context:component-scan>
<!-- 配置注解处理器映射器
功能:寻找执行类Controller
-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 配置注解处理器适配器
功能:调用controller方法,执行controller
-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<bean class="
org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- <property name="prefix" value="/WebContent/"></property> -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
MyController
@Controller
public class MyController{
//http响应头配置,在浏览器输入hello.do时,会自动定义到这个方法进行处理,这也就是@RequestMapping注解的使用方法
@RequestMapping("hello")
public String myHello() {
//跳转至index.jsp
return "index";
}
@RequestMapping("login")
public String myLogin(User user) {
System.out.println(user);
System.out.println(user.getId());
System.out.println(user.getPassword());
//跳转至success.jsp
return "success";
}
}
User
package com.mec.web.model;
public class User {
private Integer id;
private String password;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "id=" + id + ", password=" + password;
}
}
index.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>Insert title here</title>
</head>
<body>
<!-- 在点击登录后,会自动跳转至login.do,而前面的${pageContext.request.contextPath}用于自动定位
与MyController中@RequestMapping("login")方法对应 -->
<form action="${pageContext.request.contextPath}/login.do" method="post">
用户名:<input type="text" id="id" name="id"/><br/>
密码:<input type="password" id="password" name="password"/><br/>
<input type="submit" value="登录"/><br/>
</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>Insert title here</title>
</head>
<body>
<h1>成功登陆</h1>
${user.id } <br>
${user.password} <br>
</body>
</html>
接下来验证结果,hello.do解析过程不做赘述,与MyController中@RequestMapping("hello")对应,跳转到index.jsp
跳转到了success.jsp页面
2.3 接收前端参数
2.3.1接收普通pojo(最常见)
在上面的示例中我们看到了,在成功登陆后,输入的账号密码在页面中显示了,这是怎么回事呢?先来看看处理响应的方法
@RequestMapping("login")
public String myLogin(User user) {
System.out.println(user);
System.out.println(user.getId());
System.out.println(user.getPassword());
//跳转至success.jsp
return "success";
}
以及index.jsp
<form action="${pageContext.request.contextPath}/login.do" method="post">
用户名:<input type="text" id="id" name="id"/><br/>
密码:<input type="password" id="password" name="password"/><br/>
<input type="submit" value="登录"/><br/>
</form>
此时form表单中的name属性要与User(上面已经贴出)中的id与password字段名称相一致。
最后在跳转后,页面会跳转至success.jsp,参数就会显示出来,下面是success.jsp中的相应属性
${user.id } <br>
${user.password} <br>
2.3.2 接收基本类型以及其他参数
①基本类型
封装int类型参数
页面
页面传递参数都是字符串!!!!
以下为接收参数的方法
②字符串类型
页面
方法
③数组类型
分析:批量删除时使用,checkbox复选框并且value必须有值。页面
方法
④集合类型
定义一个简单的POJO
userCustom{
private user user;
private List<User> userList;
private Map<K,V> maps;
private items items;
(1)list类型
页面
参数
(2)map类型
页面
参数
2.4 页面回显
页面回显常用于用户想获取商品列表、别的用户列表,如果上述内容能顺利理解,那么下面的内容也不需要做过多讲解:
方法:
//今后这里的操作可以调用数据库或者别的存储信息xml文件
@RequestMapping("list")
public String list(Model model){
//model 相当于application域对象
List<Custom> userList = new ArrayList<Custom>();
Custom c1 = new Custom();
c1.setId(1);
c1.setSex("男");
c1.setUsername("张三");
c1.setAddress("北京");
c1.setBirthday(new Date());
Custom c2 = new Custom();
c2.setId(2);
c2.setSex("男2");
c2.setUsername("李四");
c2.setAddress("上海");
c2.setBirthday(new Date());
Custom c3 = new Custom();
c3.setId(3);
c3.setSex("男3");
c3.setUsername("王五");
c3.setAddress("广州");
c3.setBirthday(new Date());
userList.add(c1);
userList.add(c2);
userList.add(c3);
model.addAttribute("userList", userList);
return "list";
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>Insert title here</title>
</head>
<body>
<table border="1" style="color: blue">
<tr>
<td>姓名</td>
<td>生日</td>
<td>性别</td>
<td>地址</td>
<td>操作</td>
</tr>
<!-- 类似于for循环,循环显示出列表信息 -->
<c:forEach items="${userList }" var="user">
<tr>
<td>${user.username }</td>
<td>${user.birthday }</td>
<td>${user.sex }</td>
<td>${user.address }</td>
<td>
<a href="${pageContext.request.contextPath }/rest/user/updateByID/${user.id }">修改</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
输出结果如下:
2.5 转发与重定向
①转发
关键字:forward
本类方法与方法之间进行forward
转发方式:
@RequestMapping("forward")
public String forward() {
return "forward:list.do";
}
跨类进行转发:
转发方式:return ”forward:/items/list.do“;注意,在items根路径前需要有/
方法:
@RequestMapping("itemsforward")
public String ite() {
return "forward:/items/list.do";
}
YouController
package com.mec.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/items")
public class YouController {
@RequestMapping("list")
public String list() {
System.out.println("访问成功");
return "index";
}
}
请注意上面这个类上面的RequestMapping注解与方法中转发的路径是要一致的
②重定向
关键字:redirect
本类进行重定向与跨类之间的重定向与转发相似,可以自己去试试
2.6 @ResponseBody和@RequestBody
@ResponseBody把后台pojo转换json对象,返回到页面
@RequestBody接受前台json数据,把json数据自动封装javaBean
修改springmvc<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
<property name="messageConverters">
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</property>
</bean>
ajax传递 json格式数据
后台返回json
页面
代码
关于springmvc的基本使用和配置,大致讨论这么多,此篇博客只讨论使用和配置过程,其他知识网上一大堆
3.struts2与springmvc的比较
3.1实现机制:
Struts2是基于过滤器实现的。
Springmvc基于servlet实现。Servlet比过滤器快。
3.2运行速度:
Struts2是多列
请求来了以后,struts2创建多少个对象:
ActionContext,valuestack,UserAction,ActionSuport,ModelDriven
userAction里面属性:User对象,userlist集合等
Springmvc是单列。
参数封装来分析:
Struts基于属性进行封装。
Springmvc基于方法封装。