二:SpringMVC知识整理
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知识整理的更多相关文章
- SpringMVC 知识整理
SpringMVC架构设计 MVC是一种架构模式,它把业务的实现和展示相分离. SpringMVC与struts2的区别 Struts2是类级别的拦截, 一个类对应一个request上下文,Sprin ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- Android开发——Fragment知识整理(二)
0. 前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...
- js事件(Event)知识整理
事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下 鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- wifi基础知识整理
转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...
- js事件(Event)知识整理[转]
事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...
- 2.4G无线收发模块/射频RFM75调试总结/RF知识整理
射频RFM75通信是收发双方都需要编程的器件,收发双方的通道频率,空中传输速率设置一致,调试时必须先调通一块再调另一块,否则出现问题了就不知道是发送端有问题还是接收端有问题.调试必须理清思路.正确的方 ...
- 【OGG】OGG基础知识整理
[OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...
随机推荐
- Delphi编程中使用回车键不换行处理方法!!
我以前遇到过Delphi编程中使用回车键不换行的问题,一直没有找到正确处理方法,以至于每次都重新安装Delphi,今天在XE8中再次遇到这样问题,万幸找到了正确的解决方法: 可能使用过程中不小心按了i ...
- Windows server 2008 R2安装MySQL 32位ODBC驱动!
在Windows server 2008 R2安装MySQL 32位ODBC驱动,总是提示错误,我安装了DOTNET4的库,同时安装了VC2008.VC2012.VC2013的支持库,怎么还不行呢?M ...
- 面对对象二,super......反射
一.super() super() : 主动调用其他类的成员 # 单继承 # 在单继承中 super,主要是用来调用父类的方法的. class A: def __init__(self): self ...
- JMeter—断言
断言用来对服务器的响应数据做验证,常用的断言是响应断言,支持正则表达式. 一.BeanShell Assertion 用来访问JMeter的属性: log对象,可以利用此对象写日志 SampleRes ...
- 某个js插件没有执行
今天遇到一个奇怪的问题,bootstrap-table插件根本没有执行.后来发现用于执行bootstrap启动的js文件出错.导致这个不能顺利执行错误js中的程序.一般导致插件不能顺利执行有两个原因. ...
- QQ第三方登陆示例
先上图 若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现.注册方法可参考链接http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E ...
- 纯css使div垂直居中,div垂直,div居中的方法
首先编写一个简单的html代码,设置一个父div类名为boxFather,再设置一个子div类名为box1.html代码如下: <div class="boxFather"& ...
- Navicat 导出sql文件和导入sql文件
1.导出sql文件 (1)选择需要导出数据库表,右击--->转储为sql文件---->结构和数据 (2)会弹出如下界面,采用默认的数据表名,点击确认即可. 2.导入sql文件 (1)点击表 ...
- Codeforces - 331B2 权值线段树 区间合并
题意:题目太玄了我无法用语言精简.. 题目要求的操作1是基于值的,所以用普通线段树基本无法维护(反正我不知道) 换做权值型后十分好做,因为连接处必然是更后面的,这时比较一下位置就好 PS.感觉周赛越来 ...
- Hive优化-大表join大表优化
Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...