spring mvc的位置:
springMVC只是spring的一个模块;
 
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:DispatcherServlet请求HandlerMapping查找Handler(可以根据xml配置或注解进行查找)
第三步:HandlerMapping向DispatcherServlet返回Handler
第四步:DispatcherServlet调用HandlerAdapter去执行Handler
第五步:HandlerAdapter去执行Handler
第六步:Handler执行完成给HandlerAdapter返回ModalAndView
第七步:HandlerAdapter向DispatcherServlet前端控制器返回ModalAndView
第八步:DispatcherServlet请求视图解析器进行解析,根据逻辑视图名解析成真正的视图(jsp等);
第九步:视图解析器向DispatcherServlet返回View
第十步:DispatcherServlet进行视图渲染,将数据填充到request域;response响应结果
 
组件:
1.前端控制器DispatcherServlet,相当于转发器
2.处理器映射器HandlerMapping,根据url查找Handler
3.处理器适配器HandlerAdapter,执行Handler
4.处理器Handler
5.视图解析器View resolver,进行视图解析,根据逻辑视图名解析真正的视图
6.视图View,是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...);
 
一、环境搭建:
springmvc独立运行的jar包:
二、入门程序
1、前端控制器DispatcherServlet配置:
<!-- springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等)
如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析
第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
使用此种方式可以实现 RESTful风格的url
第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,
仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>

springmvc.xml下配置:

<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 "> <!-- 配置Handler -->
<bean name="/queryItems.action" class="com.cy.controller.ItemsController1"/> <!-- 处理器映射器
将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)所有的映射器都实现 HandlerMapping接口。
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 处理器适配器 所有处理器适配器都实现 HandlerAdapter接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <!-- 视图解析器
解析jsp视图,默认使用jstl标签,classpath下的得有jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>

编写handler:

开发handler,要实现controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter执行
public class ItemsController1 implements Controller{

    @Override
public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!"); itemsList.add(items_1);itemsList.add(items_2); //返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList); //指定视图
modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
return modelAndView;
}
}

视图jsp编写:

<table width="100%" border=1>
<tr>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/item/editItem.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>

url访问http://localhost:8080/springMVC/queryItems.action,图:

 三、对入门程序的补充:

1)另一个非注解的处理器映射器:在上述springmvc.xml中添加简单url映射器:

可以看到:多个处理器映射器可以并存,前端控制器判断url能让那些映射器映射,就让正确的映射器处理.

<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems.action" class="com.cy.controller.ItemsController1"/> <!-- 处理器映射器
将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)所有的映射器都实现 HandlerMapping接口。
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!--简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 对itemsController1进行url映射,url是/queryItems1.action -->
<prop key="/queryItems1.action">itemsController1</prop>
<prop key="/queryItems2.action">itemsController1</prop>
</props>
</property>
</bean>

现在url中访问:

http://localhost:8080/springMVC/queryItems1.action

http://localhost:8080/springMVC/queryItems2.action

http://localhost:8080/springMVC/queryItems.action都可以正确访问;

2)另一个非注解的适配器:

这个HttpRequestHandlerAdapter适配器要求Handler实现HttpRequestHandler接口:

<!-- 配置另外一个Handler -->
<bean id="itemsController2" name="/queryItems3.action" class="com.cy.controller.ItemsController2" /> <!-- 处理器映射器
将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)所有的映射器都实现 HandlerMapping接口。
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 另一个非注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/> <!-- 视图解析器
解析jsp视图,默认使用jstl标签,classpath下的得有jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

Handler:

public class ItemsController2 implements HttpRequestHandler{

    @Override
public void handleRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone777苹果手机!"); itemsList.add(items_1);itemsList.add(items_2); //设置模型数据
request.setAttribute("itemsList", itemsList);
//设置转发的视图
request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response); //使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
/*
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");*/
}
}

现在浏览器中访问http://localhost:8080/springMVC/queryItems3.action就能访问了;

最新文章

  1. JavaSe:ThreadLocal
  2. ubuntu登陆出现问题
  3. cocos2dx-3.x 导出自定义类到 lua 过程详解
  4. 《zw版&#183;delphi与halcon系列原创教程》hello,zw
  5. linux命令后台运行[转]
  6. C++专题 - 面向对象总结
  7. TortoiseGit上传代码到GitHub
  8. 程序减肥,strip,eu-strip 及其符号表
  9. eclipse中多个工程编译到同一个目录下
  10. 利用WebLog Experet分析日志获取性能需求
  11. mysql 基础指令/命令
  12. layui常见问题记录
  13. linux下的文件解压命令
  14. python3 TypeError: Unicode-objects must be encoded before hashing
  15. C# 集合、字典、栈和队列
  16. 【Android】1.1 开发环境安装和配置
  17. Notepad++7.5.4 设置主题,使用插件
  18. Java 8 日期时间API
  19. js框操作-----Selenium快速入门(八)
  20. 【LeetCode算法题库】Day7:Remove Nth Node From End of List &amp; Valid Parentheses &amp; Merge Two Lists

热门文章

  1. 【转】非常详细的docker学习笔记
  2. Linux下用rpm方式安装MySQL
  3. 菜鸟学习Ado.net笔记一:Ado.net学习之SqlHelper类
  4. C#判断网站运行状态是否正常
  5. 修改登录linux之后显示的默认文件夹目录
  6. Web Api学习一
  7. ORACLE输出详细错误信息错误行数
  8. 洛谷 P1316 丢瓶盖
  9. 记一次MySQl 安装1067错误
  10. linux上ln命令详细说明