SpringMVC配置及使用

大兔子大兔子 提交于 2019-12-09 02:39:12

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基于方法封装。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!