SpringMVC入门就这么简单
什么是SpringMVC?
SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发,类似于struts2框架
为什么要使用SpringMVC?
我们在之前已经学过了Struts2这么一个基于MVC的框架....那么我们已经学会了Struts2,为啥要要学习SpringMVC呢???
下面我们来看一下Struts2不足之处:
- 有漏洞【详细可以去搜索】
- 运行速度较慢【比SpringMVC要慢】
- 配置的内容较多【需要使用Struts.xml文件】
- 比较重量级
基于这么一些原因,并且业内现在SpringMVC已经逐渐把Struts2给替代了...因此我们学习SpringMVC一方面能够让我们跟上业界的潮流框架,一方面SpringMVC确实是非常好用!
可以这么说,Struts2能做的东西,SpringMVC也能够做....
回顾Struts2开发
在Struts2中,我们的开发特点是这样的:
- Action类继承着ActionSupport类【如果要使用Struts2提供的额外功能,就要继承它】
- Action业务方法总是返回一个字符串,再由Struts2内部通过我们手写的Struts.xml配置文件去跳转到对应的view
- Action类是多例的,接收Web传递过来的参数需要使用实例变量来记住,通常我们都会写上set和get方法
Struts2的工作流程
- Struts2接收到request请求
- 将请求转向我们的过滤分批器进行过滤
- 读取Struts2对应的配置文件
- 经过默认的拦截器之后创建对应的Action【多例】
- 执行完业务方法就返回给response对象
SpringMVC快速入门
导入开发包
前6个是Spring的核心功能包【IOC】,第7个是关于web的包,第8个是SpringMVC包
- org.springframework.context-3.0.5.RELEASE.jar
- org.springframework.expression-3.0.5.RELEASE.jar
- org.springframework.core-3.0.5.RELEASE.jar
- org.springframework.beans-3.0.5.RELEASE.jar
- org.springframework.asm-3.0.5.RELEASE.jar
- commons-logging.jar
- org.springframework.web-3.0.5.RELEASE.jar
- org.springframework.web.servlet-3.0.5.RELEASE.jar
编写Action
Action实现Controller接口
public class HelloAction implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
return null;
}
}
我们只要实现handleRequest方法即可,该方法已经说了request和response对象给我们用了。这是我们非常熟悉的request和response对象。然而该方法返回的是ModelAndView这么一个对象,这是和Struts2不同的。Struts2返回的是字符串,而SpringMVC返回的是ModelAndView
ModelAndView其实他就是将我们的视图路径和数据封装起来而已【我们想要跳转到哪,把什么数据存到request域中,设置这个对象的属性就行了】。
public class HelloAction implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//跳转到hello.jsp页面。
modelAndView.setViewName("/hello.jsp");
return modelAndView;
}
}
注册核心控制器
在Struts2中,我们想要使用Struts2的功能,那么就得在web.xml文件中配置过滤器。而我们使用SpringMVC的话,我们是在web.xml中配置核心控制器
<!-- 注册springmvc框架核心控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--到类目录下寻找我们的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:hello.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--映射的路径为.action-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
创建SpringMVC控制器
我们在hello.xml配置文件中把SpringMVC的控制器创建出来
<!--
注册控制器
name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
-->
<bean class="HelloAction" name="/hello.action"></bean>
访问
当我们在浏览器访问http://localhost:8080/hello.action
的时候,Spring会读取到我们的访问路径,然后对比一下我们的配置文件中是否有配置/hello.action
,如果有。那么就交由对应的Action类来进行处理。Action类的业务方法将其请求输出到hello.jsp页面上。
SpringMVC工作流程
- 用户发送请求
- 请求交由核心控制器处理
- 核心控制器找到映射器,映射器看看请求路径是什么
- 核心控制器再找到适配器,看看有哪些类实现了Controller接口或者对应的bean对象
- 将带过来的数据进行转换,格式化等等操作
- 找到我们的控制器Action,处理完业务之后返回一个ModelAndView对象
- 最后通过视图解析器来对ModelAndView进行解析
- 跳转到对应的JSP/html页面
上面的工作流程中,我们是没有讲过映射器,适配器,视图解析器这样的东西的。但是SpringMVC的环境还是被我们搭建起来了。
下面就由我来一个一个来介绍他们是有什么用的!
映射器
我们在web.xml中配置规定只要是.action为后缀的请求都是会经过SpringMVC的核心Servlet。
当我们接收到请求的时候,我们发现是hello.action,是会经过我们的核心Servlet的,那么核心Servlet就会去找有没有专门的Action类来处理hello.action请求的。
也就是说:映射器就是用于处理“什么样的请求提交给Action”处理。【默认可省略的】.....
其实我们在快速入门的例子已经配置了:name属性就是规定了hello.action到HelloAction控制器中处理!
<!--
注册控制器
name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
-->
<bean class="HelloAction" name="/hello.action"></bean>
映射器默认的值是这样的:
<!-- 注册映射器(handler包)(框架)【可省略】 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
</bean>
当然了,上面我们在创建控制器的时候【也就是HelloAction】可以不使用name属性来指定路径,可以使用我们的映射器来配置。如以下的代码:
<bean class="HelloAction" id="helloAction"></bean>
<!-- 注册映射器(handler包)(框架) -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloAction</prop>
</props>
</property>
</bean>
当我们需要多个请求路径都交由helloAction控制器来处理的话,我们只要添加prop标签就行了!
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloAction</prop>
<prop key="/bye.action">helloAction</prop>
</props>
</property>
</bean>
适配器
当我们映射器找到对应的Action来处理请求的时候,核心控制器会让适配器去找该类是否实现了Controller接口。【默认可省略的】
也就是说:适配器就是去找实现了Controller接口的类
<!-- 适配器【可省略】 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
视图解析器
我们把结果封装到ModelAndView以后,SpringMVC会使用视图解析器来对ModelAndView进行解析。【默认可省略的】
也有一种情况是不能省略的。我们在快速入门的例子中,将结果封装到ModelAndView中,用的是绝对真实路径!如果我们用的是逻辑路径,那么就必须对其配置,否则SpringMVC是找不到对应的路径的。
那什么是逻辑路径呢???我们在Struts2中,返回的是"success"这样的字符串,从而跳转到success.jsp这样的页面上。我们就可以把"success"称作为逻辑路径。
在Action中返回hello,hello是一个逻辑路径。需要我们使用视图解析器把逻辑路基补全
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//跳转到hello.jsp页面。
modelAndView.setViewName("hello");
return modelAndView;
}
如果不使用视图解析器的话,那么就会找不到页面:
因此,我们需要配置视图解析器
<!--
如果Action中书写的是视图逻辑名称,那么视图解析器就必须配置
如果Action中书写的是视图真实名称,那么视图解析器就可选配置
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 路径前缀 -->
<property name="prefix" value="/"/>
<!-- 路径后缀 -->
<property name="suffix" value=".jsp"/>
<!-- 前缀+视图逻辑名+后缀=真实路径 -->
</bean>
控制器
ParameterizableViewController
我们在之前使用Struts2的时候,如果仅仅要跳转到某个WEB-INF/JSP页面,也要写业务方法。而业务方法也仅仅是返回一个简单的字符串。
如下的代码:
public String home(){
return "home";
}
<package name="nsfw-home" namespace="/nsfw" extends="struts-default">
<action name="nsfw_*" class="zhongfucheng.nsfw.HomeAction" method="{1}">
<result name="{1}">/WEB-INF/jsp/nsfw/{1}.jsp</result>
</action>
</package>
在SpringMVC中,如果仅仅是跳转到某个视图上,我们可以省略该Action和业务方法。配置的Action只要继承着ParameterizableViewController这个类就行了!
<!-- 专用于jsp到jsp/html的转发控制器 -->
<bean name="/ok.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<!-- 转发到真实视图名 -->
<property name="viewName" value="/WEB-INF/ok.jsp"/>
</bean>
- 2017年9月26日15:57:45 现在看来, 好像还是在方法上写更好。我觉得统一管理起来会更加方便
AbstractCommandController
到目前为止,我们都没有将SpringMVC是怎么接收web端传递过来的参数的。
我们在Struts2中,只要在Action类上写对应的成员变量,给出对应的set和get方法。那么Struts2就会帮我们把参数封装到对应的成员变量中,是非常方便的。
那么我们在SpringMVC中是怎么获取参数的呢????我们是将Action继承AbstractCommandController这么一个类的。
public class HelloAction extends AbstractCommandController {
@Override
protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
return null;
}
}
在讲解该控制器之前,首先我们要明白SpringMVC控制器一个与Struts2不同的地方:SpringMVC的控制器是单例的,Struts2的控制器是多例的!
也就是说:Struts2收集变量是定义成员变量来进行接收,而SpringMVC作为单例的,是不可能使用成员变量来进行接收的【因为会有多个用户访问,就会出现数据不合理性】!
那么SpringMVC作为单例的,他只能通过方法的参数来进行接收对应的参数!只有方法才能保证不同的用户对应不同的数据!
实体
实体的属性要和web页面上的name提交过来的名称是一致的。这和Struts2是一样的!
public class User {
private String id;
private String username;
public User() {
}
public User(String id, String username) {
this.id = id;
this.username = username;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
'}';
}
}
提交参数的JSP
<form action="${pageContext.request.contextPath}/hello.action" method="post">
<table align="center">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>编号</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>
配置Action处理请求
<bean class="HelloAction" id="helloAction"></bean>
<!-- 注册映射器(handler包)(框架) -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloAction</prop>
</props>
</property>
</bean>
Action接收参数
public class HelloAction extends AbstractCommandController {
/*设置无参构造器,里边调用setCommandClass方法,传入要封装的对象*/
public HelloAction() {
this.setCommandClass(User.class);
}
/**
*
* @param httpServletRequest
* @param httpServletResponse
* @param o 这里的对象就表示已经封装好的了User对象了。!
* @param e
* @return
* @throws Exception
*/
@Override
protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
User user = (User) o;
System.out.println(user);
ModelAndView modelAndView = new ModelAndView();
//跳转到ok.jsp
modelAndView.setViewName("/WEB-INF/ok.jsp");
//将数据封装到ModelAndView中
modelAndView.addObject("USER", user);
return modelAndView;
}
}
效果:
小总结
Struts2和SpringMVC存值的区别:
- SpringMVC的工作流程:
- 用户发送HTTP请求,SpringMVC核心控制器接收到请求
- 找到映射器看该请求是否交由对应的Action类进行处理
- 找到适配器看有无该Action类
- Action类处理完结果封装到ModelAndView中
- 通过视图解析器把数据解析,跳转到对应的JSP页面
- 控制器介绍了两种:
- ParameterizableViewController
- 能够实现跳转到WEB-INF下资源,并不用写处理方法
- AbstractCommandController
- 可以实现对参数数据的封装
- ParameterizableViewController
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y
SpringMVC入门就这么简单的更多相关文章
- SpringMVC入门配置和简单实现
web.xml的配置 <!-- springmvc中央控制器 --> <servlet> <servlet-name>springmvc</servlet-n ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- 零基础学习java------38---------spring中关于通知类型的补充,springmvc,springmvc入门程序,访问保护资源,参数的绑定(简单数据类型,POJO,包装类),返回数据类型,三大组件,注解
一. 通知类型 spring aop通知(advice)分成五类: (1)前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常. (2)正常返回通知 ...
- 【Spring】SpringMVC入门示例讲解
目录结构: // contents structure [-] SpringMVC是什么 Spring MVC的设计原理 SpringMVC入门示例 1,复制Jar包 2,Web.xml文件 3,My ...
- SpringMVC入门第二天
SpringMVC第二天 1. 回顾 1.Springmvc介绍? Springmvc是Spring公司 2.Springmvc入门程序 第一步:Web工程 第二步:导Jar包 第三步:web.x ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
- SpringMVC入门学习(一)
SpringMVC入门学习(一) ssm框架 spring SpringMVC是一个Java WEB框架,现在我们知道Spring了,那么,何为MVC呢? MVC是一种设计模式,其分为3个方面 mo ...
- springMVC入门(一)
1. SpringMVC入门 1.1SpringMVC是什么 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出 ...
- SpringMVC札集(01)——SpringMVC入门完整详细示例(上)
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
随机推荐
- 解决java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList这个问题
今天使用SSM框架,用@ResponseBody注解,出现了这个问题 java.lang.IllegalArgumentException: No converter found for return ...
- 共享表空间VS独立表空间
基础概念:共享表空间 VS 独立表空间 [共享表空间] 又称为system tablespace系统表空间,a small set of data files (the ibdata files) . ...
- Mysql取随机数据效率测试(400W条中读取100条)
测试数据表的创建在文章:http://www.cnblogs.com/wt645631686/p/6868192.html 先看一下我的SQL方案 SELECT * FROM `emp` WHERE ...
- linux清屏命令(clear,reset)
(1)clear 这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息.一般都会用这个命令. (2)reset 这个命令将完全刷新终端屏幕,之前的终端输入 ...
- yum仓库详细解读
Yum:Yellowdog Updater,Modified的简称,起初由yellow dog发行版的开发者Terra Soft研发,用Python编写,后经杜克大学的Linux@Duke开发团队进行 ...
- 后台模拟请求 HttpHelper 序列化 MD5 时间戳
使用场景 C# 服务器后台调用其他服务器并处理 场景 /// <summary> /// 获取用户信息 /// </summary> /// <param name=&q ...
- 【前端】Vue2全家桶案例《看漫画》之五、引入axios
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html 项目github地址:https://github.com/shamoyuu/ ...
- ubuntu16.04卸载软件
root@test:/# dpkg -l | grep cobbler root@test:/# sudo dpkg --purge cobbler
- 阿里巴巴开源前端框架--Weex实践
Weex是最近很火很NB的一个技术产品,因为本篇介绍的是怎样使用Weex的最佳实践,所以就不罗里吧嗦的夸它怎么怎么好了,感兴趣的可以访问Weex HomePage,或加入旺旺群:1330170019. ...
- 使用mongoVUE删除大量数据的情况下失效问题
昨天有一个系统出现了问题,导致半夜时大量的错误数据产生,早晨一早接到上边通知让把这些数据尽数删除. 不可否认在数据操作时mongoVUE更加直观,因此一般情况下我也都是使用这个工具,但是今天却出现了问 ...