SpringMVC--全部
来源:互联网 发布:淘宝退款骗局过程 编辑:程序博客网 时间:2024/06/10 06:10
springmvc 第一天 springmvc的基础知识
课程安排:
第一天:springmvc的基础知识
什么是springmvc?
springmvc框架原理(掌握)
前端控制器、处理器映射器、处理器适配器、视图解析器
springmvc入门程序
目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习
非注解的处理器映射器、处理器适配器
注解的处理器映射器、处理器适配器(掌握)
springmvc和mybatis整合(掌握)
springmvc注解开发:(掌握)
常用的注解学习
参数绑定(简单类型、pojo、集合类型(明天讲))
自定义参数绑定(掌握)
springmvc和struts2区别
第二天:springmvc的高级应用
参数绑定(集合类型)
数据回显
上传图片
json数据交互
RESTful支持
拦截器
1 springmvc框架
1.1 什么是springmvc
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。(struts2与Spring整合的时候需要借助单独的jar包)
springmvc是一个基于mvc的web框架。
1.2 mvc在b/s系统 下的应用
mvc是一个设计模式,mvc在b/s系统 下的应用:
1.3 springmvc框架
第一步:发起请求到前端控制器(DispatcherServlet) –中央调度,负责request,response,查找handler,请求执行handler处理器适配器,视图解析,视图渲染。有了前端控制器,降低了各个组件的耦合,系统扩展性提高
第二步:前端控制器请求HandlerMapping查找Handler
可以根据xml配置、注解进行查找(按照一定规则)
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括Model和view
第八步:前端控制器请求视图解析器去进行视图解析(主要是解析View)
根据逻辑视图名解析成真正的视图(jsp、FreeMarker)
补充:
jsp和freeMarker是两种不同的技术,
jsp需要访问的时候访问Dao层抓取数据,生成html页面,返给浏览器。
freeMarker则是提前根据模板生成好html的静态页面,这样在访问时,直接访问到的就是一个静态页面,这个就是效率问题了,不过freeMarker适合用变化不大,但是内容很多的网页。
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
主要是将Model中的数据填充到View中
第十一步:前端控制器向用户响应结果
组件:
1、前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet减少了其它组件之间的耦合度。
2、处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View(需要程序员开发jsp)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
入门程序:
前置:引入springmvc单独jar包即可
1 配置前端控制器:
在web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<!-- springMVC前端控制器-->
<servlet>
<servlet-name>springMVC</servlet-name>
<!--spring-webmvc-4.1.3.核心包下的第一个包org.springframework.web.servlet的第二个类-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--contextConfigLocations用于配置springmvc加载的配置文件(出其里映射器、适配器等等)
如果不配置contextConfigLocations,则默认加载/WEB-INF/下的servlet名-servlet.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>
<!--
1 *.action :以.action结尾的地址由DispatcherServlet解析
2 / :所有地址都由DispatcherServlet解析 ,但是对于静态文件的解析(图片、html..)需要配置不让DispatcherServlet进行解析
注意: /* 是错的
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
1.5 在src下或者新建的一个源文件夹(config)下:新建springmvc.xml(和<param-value>classpath:springmvc.xml</param-value>对应)
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
</beans>
2写处理器类(相当于struts2的Action)
/**
* 实现Controller接口的处理器
*
* @author Administrator
*
*/
public class TestController1implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// 调用service..dao...查询 模拟静态数据
List<User_tb> ulist = new ArrayList<User_tb>();
ulist.add(new User_tb(1,"校长!!!","男",new Date(), "重庆"));
ulist.add(new User_tb(2,"美女","女",new Date(), "湖南"));
ulist.add(new User_tb(3,"帅锅","男",new Date(), "重庆"));
//返回ModelAndView
ModelAndView modelAndView =new ModelAndView();
//相当于request.setAttribute 将来在jsp页面中通过key取值
modelAndView.addObject("ulist", ulist);
//指定视图 路劲写 /+视图 ,不能是/根目录+视图 原因:转发
modelAndView.setViewName("/spview1.jsp");
return modelAndView;
}
}
3 在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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置Handler -->
<bean name="/TestController1.action" class="com.controller.TestController1" />
<!--
处理器映射器 将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
所有的映射器都实现 HandlerMapping接口。
-->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器 默认使用jstl,如果是其他开发工具,得保证拥有jstl的包(myeclipse自带)-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
4 编写jsp --view1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<table border="1">
<tr>
<Td>id</Td>
<Td>姓名</Td>
<Td>性别</Td>
<Td>生日</Td>
<Td>地址</Td>
</tr>
<c:forEach items="${ulist }" var="i">
<tr>
<Td>${i.id }</Td>
<Td>${i.name }</Td>
<Td>${i.sex }</Td>
<Td>${i.birthday }</Td>
<Td>${i.address }</Td>
</tr>
</c:forEach>
</table>
</body>
</html>
5测试:开启Tomcat,然后http://localhost:8080/springMVC/TestController1.action
非注解的处理器映射器 (在springmvc.xml中)
处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping (以上的例子用的就是这个)
另一个映射器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
<!-- 配置Handler -->
<bean id="testController1" name="/TestController1.action" class="com.controller.TestController1" />
<!--简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 进行url映射,key为映射地址,值为bean的id,会根据id找到 com.controller.TestController1-->
<prop key="/TestController2.action">testController1</prop>
<prop key="/TestController3.action">testController1</prop>
</props>
</property>
</bean>
<!--
处理器映射器 将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
所有的映射器都实现 HandlerMapping接口。
-->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
分别测试url地址为 :
http://localhost:8080/springMVC/TestController1.action
http://localhost:8080/springMVC/TestController2.action
http://localhost:8080/springMVC/TestController3.action
发现都映射到了TestController1这个处理器中去,表明多个映射器可以并存
注意:所有的映射器都实现了HandlerMapping接口
非注解的处理器适配器(在springmvc.xml中)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter (以上的例子用的就是这个)
要求编写的Handler实现Controller接口。
另一个适配器:
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的Handler实现 HttpRequestHandler接口。
步骤:
1:
<!-- 处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 另一个非注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
2:新建TestController2处理器类implements HttpRequestHandler
public class TestController2implements HttpRequestHandler{
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 调用service..dao...查询 模拟静态数据
List<User_tb> ulist = new ArrayList<User_tb>();
ulist.add(new User_tb(1,"校长!!!","男",new Date(), "重庆"));
ulist.add(new User_tb(2,"美女","女",new Date(), "湖南"));
ulist.add(new User_tb(3,"帅锅","男",new Date(), "重庆"));
request.setAttribute("ulist", ulist);
request.getRequestDispatcher("/view1.jsp").forward(request, response);
}
}
3 配置映射器
<!-- 配置Handler -->
<bean id="testController1" name="/TestController1.action" class="com.controller.TestController1" />
<bean id="testController2" class="com.controller.TestController2" />
<!--简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 进行url映射,key为映射地址,值为bean的id,会根据id找到 com.controller.TestController1-->
<prop key="/TestController2.action">testController1</prop>
<prop key="/TestController3.action">testController1</prop>
<prop key="/TestController4.action">testController2</prop>
</props>
</property>
</bean>
<!--
处理器映射器 将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
所有的映射器都实现 HandlerMapping接口。
-->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
4 测试:重启服务;访问:http://localhost:8080/springMVC/TestController4.action
发现问题:以上不管是哪种
使用该方法可以写特殊的需求:比如返回json格式(需要response)
//响应客户端
PrintWriter out= response.getWriter();
out.print(str);
总结:映射器是独立的, 适配器和处理器是有关联的,
SimpleControllerHandlerAdapter 适配器的Handler类需要实现Controller接口
HttpRequestHandlerAdapter适配器的Handler类需要实现HttpRequestHandler接口
但不管是哪一种:都只能在Handler类中写一个方法,不适用!!
如果就算我们把 springmvc.xml中的的映射器、适配器、视图解析器删除,一样可以执行
因为在下面路径中有个属性文件:打开后发现默认有配置
从这里开始是工作中的应用,以上全是原理
注解的处理器映射器和适配器
从以上打开的properties文件中可以查到过期的(default)注解适配器和映射器:
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。
<!-- 注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 使用mvc:annotation-driven代替上边两个注解映射器和注解适配器,而且该方法默认加载了很多参数的绑定方法(如json的转换方式..) 实际开发使用该方法 -->
<mvc:annotation-driven></mvc:annotation-driven>
注解的处理器(Handler)开发步骤:
前提:使用注解的映射器和注解的适配器。(注解的映射器和注解的适配器必须配对使用)
1 在Handler类中自定义方法:无需实现接口
/**
* 实现Controller接口的处理器
*
* @author Administrator
*
*/
//使用注解Controller标识它是一个控制器 ,注意由于这是springMVC模块了,不能使用@Component了,用了则报错
@Controller
public class TestController3 {
/**
*查询所有客户
*@RequestMapping:实现让url和方法进行映射,一个方法对应一个url
*一般建议将url和方法名写成一样,方便维护,他们本身是没有关系的
*/
@RequestMapping("/findAllUsers.action")
public ModelAndView findAllUsers(){//方法名自定义,而且可以在该controller中写其他方法了,比如增删改查
//调用service..dao...查询 模拟静态数据
List<User_tb> ulist = new ArrayList<User_tb>();
ulist.add(new User_tb(1,"校长!!!","男",new Date(), "重庆"));
ulist.add(new User_tb(2,"美女","女",new Date(), "湖南"));
ulist.add(new User_tb(3,"帅锅","男",new Date(), "重庆"));
//返回ModelAndView
ModelAndView modelAndView =new ModelAndView();
//相当于request.setAttribute 将来在jsp页面中通过key取值
modelAndView.addObject("ulist", ulist);
//指定视图 路劲写 /+视图 ,不能是/根目录+视图
modelAndView.setViewName("/view1.jsp");
return modelAndView;
}
}
2 配置springmvc.xml
<!-- 配置Handler -->
<!--
对于注解的Handler可以单独配置,而且不需要写id,因为在Handler类中已经配置了url了(该id就是用来配置url的)
但在实际开发中使用组件扫:一般扫描controller,service...
-->
<!-- <bean class="com.controller.TestController3" /> -->
<context:component-scan base-package="com.controller"></context:component-scan>
注意:这里必须要扫描或单独配置Handles类完整的路径,因为注解已经不是以前的@Component(回顾:@Component注解相当于bean的id以及class=”包名+类名”),而@Controller注解不包含class=”包+类”
3 测试:重启服务:http://localhost:8080/springMVC/findAllUsers.action
视图解析器配置前缀和后缀
在springmvc.xml中:
<!-- 视图解析器 默认使用jstl,如果是其他开发工具,得保证拥有jstl的包(myeclipse自带)-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 配置jsp路径前缀 -->
<property name="prefix" value="/" />
<!-- 配置jsp路径后缀 -->
<property name="suffix" value=".jsp" />
</bean>
在 Handler类中:
modelAndView.setViewName("view1");//以前是/view1.jsp,但/和.jsp已经配置好了
- SpringMVC--全部
- springmvc 全部约束
- springmvc 0初始篇:springmvc的全部运行流程与开发步骤
- 选择全部 取消全部
- SpringMVC
- springmvc
- SpringMVC
- SpringMVC
- springMvc
- springMVC
- springmvc
- springMVC
- springMVC
- springmvc
- SpringMVC
- SpringMVC
- springMvc
- springmvc
- jquery——设置、读取、删除cookie
- 系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常
- HDU2389Rain on your Parade(二分图最大匹配之Hopcroft-Karp)
- 归并排序
- 状态压缩DP
- SpringMVC--全部
- const只读
- 素数对<筛选法求解>
- 尾递归:实际中为什么快排会比堆排快?
- 跳转动画——右进左出
- Android环境下手动写出观察者模式(非原生)
- iOS积累--iOS 出现内存泄漏的几种原因
- UDP广播
- Redis发布订阅