SpringMVC配置及使用

xiaoxiao2021-02-28  29

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

转载请注明原文地址: https://www.6miu.com/read-2602706.html

最新回复(0)