微信小程序填坑之路之springmvc-XML版(二)

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

本帖子介绍ssm框架之一的springmvc,网上的资料常常把它和struts进行对比,为了掌握一个框架,了解它的原理,知晓与它对等框架之间的区别和联系很有必要,这里提供一个分析springmvc和struts很好的一篇博客:http://blog.csdn.net/gstormspire/article/details/8239182

对于springmvc(也称之为Spring Web MVC),其整体工作流程我画了一个草图,如下

springmvc有两种配置方式,一种是基于springmvc.xml文件进行配置,一种是基于注解的配置,当然后者更广泛的被应用,本篇将介绍的是xml版配置,之后介绍注解版的配置。之所以不直接学习实用的注解配置,正是因为“学习”二字,这是一个过程,我习惯于从繁化简(当学习到最后我能吐槽一句原来这样更简单就说明我成功了)

图中的前端控制器即为 DispatcherServlet ,在web.xml中配置

xml文件解析:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>MVC</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12. <!-- 注册控制器 -->
  13. <servlet>
  14. <servlet-name>springmvc</servlet-name>
  15. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  16. <init-param>
  17. <param-name>contextConfigLocation</param-name>
  18. <param-value>classpath:config/springmvc.xml</param-value>
  19. </init-param>
  20. </servlet>
  21. <servlet-mapping>
  22. <servlet-name>springmvc</servlet-name>
  23. <url-pattern>*.mn</url-pattern>
  24. </servlet-mapping>
  25. </web-app>

welcome-file-list 是默认进入页面,即直接输入 “localhost:8080/项目名/” 就会加载的页面,默认名为index,在/WebContent目录下

导入springmvc所需的jar包:http://pan.baidu.com/s/1kV39hC7
目前还未使用maven,所以直接下载jar包放入/WebContent/WEB-INF/lib目录下即可

init-param为选填,如果不写,则DispatcherServlet默认会去查找/WEB-INF/<servlet-name>-servlet.xml文件,(例:我上诉的配置将会自动去查到springmvc-servlet.xml

如果配置了init-param,则会根据param-value去对应的目录下查找配置文件,并且可以自定义xml文件名称。
其中param-name是固定名称,大小写敏感
classpath:表示根目录(与src同级)
如上诉配置,DispatcherServlet会去src/config下寻找springmvc.xml文件

(自定义的方式可以更好的统一管理配置文件,建议使用)

url-pattern配置拦截器,即判断什么请求可以去访问action类。上诉配置是接受以.mn为后缀的请求,也可以写成/*,但是这样会接受所有的请求,包括html、jsp后缀,对于页面的请求我们是不需要到后台的,所以不建议该写法,拦截器可配置多个,重复写servlet-mapping即可

创建Action类:

Action类的形式有很多
可以是实现接口的类,可以是继承类,甚至可以是普通类

以实现Controller为例(这不是最好的方法)

  1. package action;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.web.servlet.ModelAndView;
  5. import org.springframework.web.servlet.mvc.Controller;
  6. public class HelloWorldAction implements Controller{
  7. @Override
  8. public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse resp) throws Exception {
  9. ModelAndView modelAndView=new ModelAndView();
  10. modelAndView.addObject("msg","第一个springmvc项目!");
  11. modelAndView.setViewName("/jsp/helloWorld.jsp");
  12. return modelAndView;
  13. }
  14. }

addObject用于传值,setViewName指定返回的模型(注意,现在写的是真实路径)

创建JSP页面

  1. <body>
  2. ${requestScope.msg}
  3. </body>

这是JSP的EL表达式,不需要过多理解,只要知道是获取Action传递的值

springmvc.xml 配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
  10. <!-- 注册Action处理类 -->
  11. <bean name="/hw.mn" class="action.HelloWorldAction"></bean>
  12. </beans>

这是最简单的配置,头信息固定不变,需要我们写的只有Action处理类,class表示处理类的全路径,name表示请求路径。

运行结果:

运行成功

springmvc.xml 配置扩展

在springmvc.xml中可以配置的有:
1.注册Action处理类(控制器)
2.映射器
3.适配器
4.视图解析器
有这么多,但是我们上面只写了一行处理类,由此可见,Action处理类是必写项,而其它的都是可选
完整版如下:

  1. <bean name="/hw.mn" class="action.HelloWorldAction"></bean>
  2. <!-- 映射器 BeanNameUrlHandlerMapping(其中之一)表示将上一行bean标签中的name属性当作url请求-->
  3. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
  4. </bean>
  5. <!-- 适配器 SimpleControllerHandlerAdapter表示用于寻找HelloWorldAction类-->
  6. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
  7. </bean>
  8. <!-- 视图解析器 InternalResourceViewResolver表示通过ModelAndView封装的视图名找到页面-->
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  10. </bean>

通过三种常见场景,理解一下它们

注册处理器(控制器)

页面之间的跳转
不推荐配置拦截器的时候使用/*,是因为当直接跳转页面请的时候,请求是不需要经过后台的,如果写成/*会导致普通的跳转页面也要经过后台。这里就有一个问题需要注意的,当你要跳转的页面不在WEB-INF下的时候,可以直接在url上写上真实路径就能跳转。

例如:<a href="${pageContext.request.contextPath }/jsp/xxx.jsp">跳转到jsp文件夹下的页面</a>
前面部分是EL表达式获取当前路径,等价http://localhost:8080/springMVC
但是!如果你要请求的页面在WEB-INF下的话,出于安全考虑,这个设定就是不能通过url直接访问WEB-INF目录下的页面,不过,通过配置控制器

  1. <bean name="/xxx.mn" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
  2. <property name="viewName" value="success"/>
  3. </bean>

可以把.mn请求通过 ParameterizableViewController 类转换成普通的页面之间跳转,包括对WEB-INF目录下页面的访问

映射器

之前的例子可以理解为一对一,一个请求就需要写一个Action处理类的bean,如果多个请求访问的是同一个Action类,则是如下写法:

  1. <bean name="/hw1.mn" class="action.HelloWorldAction"></bean>
  2. <bean name="/hw2.mn" class="action.HelloWorldAction"></bean>
  3. <bean name="/hw2.mn" class="action.HelloWorldAction"></bean>
  4. <!--映射器-->
  5. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

优化后的代码:

  1. <bean id="hwId" class="action.HelloWorldAction"></bean>
  2. <!-- 映射器 -->
  3. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  4. <property name="mappings">
  5. <props>
  6. <!-- key表示请求路径 -->
  7. <prop key="/hw1.mn">hwId</prop>
  8. <prop key="/hw2.mn">hwId</prop>
  9. <prop key="/hw3.mn">hwId</prop>
  10. </props>
  11. </property>
  12. </bean>

此时注册Action处理类不是用name,而是用id,通过SimpleUrlHandlerMapping实现多个请求访问同一个Action



视图解析器

刚开始在Action类中setViewName方法写的是文件的真实路径,那如何使用逻辑路径定位到真实的页面路径呢

视图解析器就是做这一行的:
springmvc.xml新增配置:

  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <property name="prefix" value="/jsp/"/>
  3. <property name="suffix" value=".jsp"/>
  4. </bean>

HelloWorld.java:

  1. public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse resp) throws Exception {
  2. ModelAndView modelAndView=new ModelAndView();
  3. modelAndView.addObject("msg","第一个springmvc项目!");
  4. modelAndView.setViewName("helloWorld");
  5. return modelAndView;
  6. }

此时会自动把helloWorld补全成/jsp/helloWorld.jsp

小技巧:
eclipse打开文件所在目录插件,使用Marketplace下载安装非常慢,这里提供出离线插件
http://pan.baidu.com/s/1geEqzXx

分享到:

1人打赏积分

JeremyLu
陈小术
陈小术 2016-12-19 15:19:09.0

可以,学习了~

JeremyLu
JeremyLu 2016-12-19 15:30:51.0

直接上springboot

toBeMN
toBeMN 2016-12-19 15:40:16.0

@JeremyLu 大妖怪的最爱还不让他出

3条评论
我来说两句...
x
 
Ctrl+Enter
作者

toBeMN

toBeMN

APP:3 帖子:24 回复:59 积分:3193

已加入社区[3072]天

梦想成为全栈的男人

作者详情》