springmvc复习:

1.SpringMVC介绍

2.SpringMVC入门程序

	1)创建web工程
2)导入jar包
3)在web.xml中配置前端控制器(指定上下文件的路径 classpath:springmvc.xml)
*.do(*.action)拦截以do结尾的 /拦截所有(不包含jsp) /*拦截所有
4)springmvc.xml配置扫描@controller注解
5)Action Controller Handler处理器 程序员书写的 类上@Controller
方法上@RequestMapping(value=请求的路径) .action可省略
public ModelAndView itemList(){
new ModelAndView
设置数据
设置jsp页面的路径 /WEB-INF/demo.jsp
}

3.SpringMVC架构分析 (一个中心,三个基本点,两个开发)

	前端控制器  (由springmvc提供)
处理器映射器 处理器适配器 视图解析器 (由springmvc提供)
Handler处理器 jsp视图 (由程序员书写)

4.springmvc原理

	1)用户请求到前端控制器
2)前端控制器让处理器映射器根据rul去找具体的处理器中请求映射的路径,对应的方法,
返回找到的方法(包名+类名+方法名)
3)前端控制器通过处理器适配器调用处理器去执行此方法(执行前绑定参数),返回ModelAndView
4)前端控制器让视图解析器去解析ModelAndView,返回具体View
5)前端控制器对View进行渲染视图(即将模型数据填充至视图中)
6)前端控制器渲好的html响应给用户

5.默认的三大组件(前两个废弃了,采用下面的这两个)

	RequestMappingHandlerMapping
RequestMappingHandlerAdapter
<mvc:anonation-driver/>注解驱动--可替代上面两大组件
InternalResourceViewResolver视图解析器:优化前缀及后缀

6.整合MyBatis

整合思想:

		1)SqlMapConfig.xml  mybatis配置文件
别名
2)applicationContext.xml spring配置文件
数据源(c3p0,dbcp,druid):读取db.properties(创建db.properties文件)
mybatis的会话工厂(SqlSessionFactory)
mybatis的mapper 动态代理开发扫描-基本包
[开启事务,扫描@service]
3)创建springmvc.xml文件
扫描基本包(com.spring) 此包下controller,service全扫描
手动配置三大组件
4)web.xml文件
配置监听器读取applicationContext.xml上下文
配置前端控制器读取springmvc.xml
配置post提交乱码(Filter过滤器)

6.参数绑定

1)默认参数绑定

		Request  Response  Session  Model(接口)->ModelMap(实现类)

2)简单类型参数绑定

		方法的形参上(@RequestParam("name")Integer/String/Double/Boolean...)
表单参数与形参一致(不一致可以用@RequestParam注解)

3)pojo类型

		方法的形参上(@ModelAttribute("user")User user)
表单参数与实体属性一致
可以使用@ModelAttribute注解:将请求参数封装到对象user中,并以key=user存储到request作用域中

4)QueryVo包装类(里面item)

		表单参数与包装类中item对象的属性一致
QueryVo vo.item(实体属性) -- item.name(表单参数)

5)自定义参数类型 转换日期 2018:12_16 15:00_12

		①.springmvc.xml里配置转换器的工厂
②.converters -> list/set/array -> <bean class="自定义转换器类"/>
<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 配置多个转换器-->
<property name="converters">
<list>
<bean class="com.springmvc.conversion.DateConveter"/>
</list>
</property>
</bean>
③.创建自定义转换器类
实现Converter<S,T> S:页面传递过来的类型 T:转换后的类型

7.SpringMVC中控制层类

	1)入口是一个servlet,即前端控制器
2)单例模式(基于方法开发,请求参数传递到方法的形参)
3)请求参数是形参(不能是成员变量)
4)mav.addObject()只能存到request作用域中

8.参数绑定高级参数:

	数组:页面选中多个checkbox向controller方法传递
Controller方法中可以用Integer[]/String[]接收,或者pojo的Integer[]/String[]属性接收
集合:List中存放对象,并将定义的List放在包装类QueryVo中
private List<Item> itemList;
表单name属性必须是list属性名+下标+元素属性
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始
begin、end、step分别表示:起始序号,结束序号,跳跃步伐

9.@RequestMapping注解

1.url路径映射

		value值是数组,可以将多个url映射到同一个方法
@RequestMapping(value = { "itemList", "itemListAll" })

2.窄化路径

		在class上添加@RequestMapping(url)指定通用请求前缀

3.请求方法限定

		限定GET方法
@RequestMapping(method = RequestMethod.GET)
限定POST方法
@RequestMapping(method = RequestMethod.POST)
GET和POST都可以
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

10.Controller方法返回值

1.返回ModelAndView

		controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view

2.返回void

		在Controller方法形参上可以定义request和response,使用request或response指定响应结果
1)request.getRequestDispatcher("页面路径").forward(request, response);
2)response.sendRedirect("url")
3)response.getWriter().print("{\"abc\":123}");

3.返回字符串

		1)逻辑视图名
指定逻辑视图名,经过视图解析器解析为jsp物理路径
return "itemList";
2)Redirect重定向
return "redirect:/itemEdit.action?itemId=" + item.getId();
3)forward转发
return "forward: /itemEdit.action"; 1.ModelAndView 无敌的 带着数据 返回视图路径 (不建议使用)
2.String 返回视图路径 model带数据 (官方推荐此种方式 解耦 数据 视图 分离 MVC) 建议使用
3.void ajax 请求 合适 json格式数据 (response 异步请求使用)

重定向后浏览器地址栏变更为重定向的地址,

重定向相当于执行了新的request和response,所以之前的请求参数都会丢失

如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,

转发并没有执行新的request和response,所以之前的请求参数都存在

11.异常处理器

1)系统中异常包括两类:预期异常和运行时异常RuntimeException。

2)系统的dao、service、controller出现都通过throws Exception向上抛出,

最后由springmvc前端控制器交由异常处理器进行异常处理

3)步骤:

		a.自定义异常类(MyException)
b.自定义异常处理器(CustomHandlerException)(实现异常处理器HandlerExceptionResolver)
c.异常处理器配置(将自定义异常处理器注入到spring容器)
d.编写错误页面(error.jsp)

12.上传图片

1)配置虚拟目录

		在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:
<Context docBase="E:\mysource\upload\temp" path="/pic" reloadable="false"/>

2)加入jar包

		commons-fileupload-1.2.2.jar
commons-io-2.4.jar

3)配置上传解析器(springmvc.xml)

		<!-- 文件上传,id必须设置为multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件上传大小 -->
<property name="maxUploadSize" value="5000000" />
</bean>

4)设置表单可以进行文件上传

		enctype="multipart/form-data"

5)图片上传(形参:MultipartFile pictureFile)

		// 设置图片名称,不能重复,可以使用uuid
String picName = UUID.randomUUID().toString();
// 获取文件名
String oriName = pictureFile.getOriginalFilename();
// 获取图片后缀
String extName = oriName.substring(oriName.lastIndexOf("."));
// 开始上传
pictureFile.transferTo(new File("C:/upload/image/" + picName + extName));
// 设置图片名到商品中
item.setPic(picName + extName);
// 更新商品
this.itemService.updateItemById(item);

13.json数据交互

1)@RequestBody

		@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口
将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上

2)@ResponseBody

		@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口
转换为指定格式的数据如:json,xml等,通过Response响应给客户端

3)springmvc支持json包

		jackson-annotations-2.4.0.jar
jackson-core-2.4.2.jar
jackson-databind-2.4.2.jar

4)发送json字符串

		$(function(){
var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';
$.ajax({
type : "post",
url : "${pageContext.request.contextPath }/json.action",
data : params,
contentType : "application/json;charset=UTF-8",//发送数据的格式
success : function(data){
alert(data.name);
}
dataType : "json",//回调
});
});

5)json测试

		@RequestMapping("testJson")
public @ResponseBody Item testJson(@RequestBody Item item) {
return item;
}

14.RESTful支持

1.Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格.

2.从url上获取商品id,步骤如下:

		1)使用注解@RequestMapping("item/{id}")声明请求的url
{xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
2)使用(@PathVariable() Integer id)获取url上的数据
@RequestMapping("item/{id}")
@ResponseBody
public Item queryItemById(@PathVariable() Integer id) {
Item item = this.itemService.queryItemById(id);
return item;
}
注:如果@RequestMapping中表示为"item/{id}",id和形参名称一致,@PathVariable不用指定名称。
如果不一致,例如"item/{ItemId}"则需要指定名称@PathVariable("itemId")

3.注意两个区别:

		1).@PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)
2).如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面,返回目前的json数据。
如果不加,就走视图解析器,返回页面

15.拦截器

1)定义拦截器(实现HandlerInterceptor接口)

		public class MyHandlerInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// 从request中获取session
HttpSession session = request.getSession();
// 从session中获取username
Object username = session.getAttribute("username");
// 判断username是否为null
if (username != null) {
// 如果不为空则放行
return true;
} else {
// 如果为空则跳转到登录页面
response.sendRedirect(request.getContextPath() + "/user/toLogin.action");
return false;
}
}
}

2)在springmvc.xml中配置拦截器

		<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置商品被拦截器拦截 -->
<mvc:mapping path="/item/**" />
<!-- 所有的请求都进入拦截器 -->
<!-- <mvc:mapping path="/**" /> -->
<!-- 配置具体的拦截器 -->
<bean class="com.springmvc.interceptor.MyHandlerInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

拦截器总结:

		preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用 postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用(当第一个拦截器为不为true时都不会调用)

二:SpringMVC知识整理的更多相关文章

  1. SpringMVC 知识整理

    SpringMVC架构设计 MVC是一种架构模式,它把业务的实现和展示相分离. SpringMVC与struts2的区别 Struts2是类级别的拦截, 一个类对应一个request上下文,Sprin ...

  2. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  3. Android开发——Fragment知识整理(二)

    0.  前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...

  4. js事件(Event)知识整理

    事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下   鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...

  5. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  6. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

  7. js事件(Event)知识整理[转]

    事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...

  8. 2.4G无线收发模块/射频RFM75调试总结/RF知识整理

    射频RFM75通信是收发双方都需要编程的器件,收发双方的通道频率,空中传输速率设置一致,调试时必须先调通一块再调另一块,否则出现问题了就不知道是发送端有问题还是接收端有问题.调试必须理清思路.正确的方 ...

  9. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

随机推荐

  1. Delphi编程中使用回车键不换行处理方法!!

    我以前遇到过Delphi编程中使用回车键不换行的问题,一直没有找到正确处理方法,以至于每次都重新安装Delphi,今天在XE8中再次遇到这样问题,万幸找到了正确的解决方法: 可能使用过程中不小心按了i ...

  2. Windows server 2008 R2安装MySQL 32位ODBC驱动!

    在Windows server 2008 R2安装MySQL 32位ODBC驱动,总是提示错误,我安装了DOTNET4的库,同时安装了VC2008.VC2012.VC2013的支持库,怎么还不行呢?M ...

  3. 面对对象二,super......反射

    一.super() super()  : 主动调用其他类的成员 # 单继承 # 在单继承中 super,主要是用来调用父类的方法的. class A: def __init__(self): self ...

  4. JMeter—断言

    断言用来对服务器的响应数据做验证,常用的断言是响应断言,支持正则表达式. 一.BeanShell Assertion 用来访问JMeter的属性: log对象,可以利用此对象写日志 SampleRes ...

  5. 某个js插件没有执行

    今天遇到一个奇怪的问题,bootstrap-table插件根本没有执行.后来发现用于执行bootstrap启动的js文件出错.导致这个不能顺利执行错误js中的程序.一般导致插件不能顺利执行有两个原因. ...

  6. QQ第三方登陆示例

    先上图 若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现.注册方法可参考链接http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E ...

  7. 纯css使div垂直居中,div垂直,div居中的方法

    首先编写一个简单的html代码,设置一个父div类名为boxFather,再设置一个子div类名为box1.html代码如下: <div class="boxFather"& ...

  8. Navicat 导出sql文件和导入sql文件

    1.导出sql文件 (1)选择需要导出数据库表,右击--->转储为sql文件---->结构和数据 (2)会弹出如下界面,采用默认的数据表名,点击确认即可. 2.导入sql文件 (1)点击表 ...

  9. Codeforces - 331B2 权值线段树 区间合并

    题意:题目太玄了我无法用语言精简.. 题目要求的操作1是基于值的,所以用普通线段树基本无法维护(反正我不知道) 换做权值型后十分好做,因为连接处必然是更后面的,这时比较一下位置就好 PS.感觉周赛越来 ...

  10. Hive优化-大表join大表优化

    Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...