SpringMVC和之前我们自己写的MVC程序的好处是,我感觉哈,SpringMVC已经帮我们把好多事情搞好了,之前我写的MVC,有前端控制器,很多很多个后端控制器,配置文件啥的,SpringMVC也有这些,我们在使用SpringMVC的时候我们不需要写前端控制器了,但是可能对我们说,我们要进行各种各样的配置,比如我们要建立一个maven项目,我数了一下,有三个配置文件,可能对初学的我们对这些多的配置是很烦的,还不如用我们之前的MVC,原因是什么呢?因为我们之前的MVC已经写得很熟了,现在刚刚接触Spring框架,很流利的上手是会有点难,像这些框架是是简化我们代码的,像工具一样,熟能生巧。
SpringMVC入门程序:
一、首先我们创建一个maven项目,在pom.xml配置文件添加相应的jar包。(上一个博客有贴jar包代码)
之后我们在web.xml配置文件配置我们的DispatcherServlet(前端)控制器,
<servlet>
<!-- 这里的名字可以随便起,但是为了我们方便管理,最好是项目名称 -->
<servlet-name>SpringBasicMVC01</servlet-name>
<!-- 前端控制器的完全限定名,可以通过从我们的jar包中拿到这个名字 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 这个是DispatcherServlet控制器要读取的字段名,不可以随便起! -->
<param-name>contextConfigLocation</param-name>
<!-- 按照这个格式填写,SpringBasicMVC01.xml这个配置文件名和接下来我们在资源文件中创建的文件名要一致
之后DispatcherServlet控制器会读取里面的配置信息
-->
<param-value>classpath:SpringBasicMVC01.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 这个要和上面的servlet-name名称保持一致! -->
<servlet-name>SpringBasicMVC01</servlet-name>
<!-- 拦截的url,这样写的是任意以.do结尾的请求都会进入DispatcherServlet控制器 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
二、我们写一个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>
<a href="${pageContext.request.contextPath }/test.do">1.访问Controller</a>
</body>
</html>
这里的${pageContext.request.contextPath }/test.do是url,之后电击这个超链接会被DispatcherServlet拦截到,${pageContext.request.contextPath }这个是EL表达式,网页上显示的是项目名,这样为了灵活,不写死。
三、写后端控制器和SpringBasicMVC02.xml配置文件
(后端控制器是相对前端而言的,为了便于区分,不混淆。)
/**
* 后端控制器
* 实现Controller接口,实现接口的handleRequest方法
* 当然实现哪个接口根据我们SpringBasicMVC01.xml配置文件中的处理器决定的
* @author: 满脑子代码的祝大朋
* @date: 2019年1月10日 下午7:05:48
*/
public class WebAction implements Controller
{
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp ) throws Exception
{
//实例化ModelAndView对象
ModelAndView mv = new ModelAndView();
//添加模型数据
mv.addObject("data", "66666");
//设置下一视图
mv.setViewName("main");
//返回
return mv;
}
}
接下来要在SpringBasicMVC02.xml配置文件配置相关的处理器,映射器,视图解析器
处理器决定自定义的Controller如何实现
映射器决定客户端传递过来的url如何映射到对象的Controller
视图解析器决定如何生成响应给客户端
<!-- 配置处理器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 配置映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!--prefix:前缀 suffix:后缀 这样写的话,/WEB-INF/jsp/main.jsp这样一个连接,只需要在后端控制器写 mian 就行了 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 设置映射关系,DispatcherServlet(前端)控制器会根据/test.do找到后端控制器(WebAction) -->
<bean name="/test.do" class="com.study.web.WebAction" />
此时当我在页面点击超链接,这个请求会进前端控制器,前端控制器会根据这个请求url找到后端控制器,有后端控制器进行相关业务操作之后,返回下一个视图的url再到前端控制器中,前端控制器再进行转向。此时我们转向/WEB-INF/jsp/main.jsp页面
当然,刚刚点在后端控制器代码注释了,实现的接口可以不一样!这些都取决我们的配置文件,感兴趣的可以看一下jar包,里面有很多接口,都有着不能的功能!
/**
* 实现HttpRequestHandler,上一个实现 Controller接口的话
* 两者实现的方法就不一样了,这里做个对比
* Controller接口
* 有返回值,返回值类型是ModelAndView
* 通过addObject()把信息存入模型数据,模型数据会存入request作用域
* 通过setViewName()设置转向下一个视图的名称。
* HttpRequestHandler接口
* 无返回值
* 把数据存入到request作用域中和转向方法和我们之前写的一样
* @author: 满脑子代码的祝大朋
* @date: 2019年1月10日 下午7:44:36
*/
public class WebAction implements HttpRequestHandler
{
@Override
public void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
req.setAttribute("data", "66666");
req.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(req, resp);
}
}
配置也需要改变,需要改处理器和映射器!
代码如下
<!-- 配置处理器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
<!-- 配置映射器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test.do">webAction</prop>
</props>
</property>
</bean>
<bean id="webAction" class="com.study.web.WebAction" />
当然,关系映射器和之前一样。
四、main.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>
This is a main.jsp;
</body>
</html>
经过运行就可以完成这个SpringMVC的简单入门程序了!
记录,总结,分享!学习永远在路上!