欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC配置及使用

程序员文章站 2022-07-09 17:03:33
...

1、什么是SpringMVC

SpringMVC是web层的一个MVC框架,类似于struts2


2.SpringMVC的基本配置和常见使用

2.1 基于xml的配置

SpringMVC所需要的jar包

SpringMVC配置及使用

上传本次例子的目录

SpringMVC配置及使用

在介绍springmvc的配置之前,先来看看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>

最后展现出结果

SpringMVC配置及使用


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

SpringMVC配置及使用

跳转到了success.jsp页面

SpringMVC配置及使用

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类型参数

页面

SpringMVC配置及使用

页面传递参数都是字符串!!!!

以下为接收参数的方法

SpringMVC配置及使用

②字符串类型

页面

SpringMVC配置及使用

方法

SpringMVC配置及使用

③数组类型

分析:批量删除时使用,checkbox复选框并且value必须有值。

页面

SpringMVC配置及使用

方法

SpringMVC配置及使用

④集合类型

定义一个简单的POJO

userCustom{
private user user;
private List<User> userList;
private Map<K,V> maps;

private items items;
(1)list类型

页面

SpringMVC配置及使用

参数

SpringMVC配置及使用

(2)map类型

页面

SpringMVC配置及使用

参数

SpringMVC配置及使用


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>

输出结果如下:

SpringMVC配置及使用

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格式数据

SpringMVC配置及使用
后台接收

SpringMVC配置及使用

后台返回json

页面

SpringMVC配置及使用

代码

SpringMVC配置及使用

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