SpringMVC注解开发(基础)---SpringMVC学习笔记(七)
来源:互联网 发布:人工智能的负面影响 编辑:程序博客网 时间:2024/04/28 06:12
需求
商品修改功能开发。
操作流程:
1、进入商品查询列表页面
2、点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询)
要修改的商品从数据库查询,根据商品id(主键)查询商品信息
3、在商品修改页面,修改商品信息,修改后,点击提交
第一步:开发Mapper(也就是Dao层)
mapper:
根据id查询商品信息
根据id更新Items表的数据
不用开发了,使用逆向工程生成的代码。
第二步:开发Service
接口功能:
根据id查询商品信息
修改商品信息
service接口:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
service接口的实现类:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
第三步:开发controller(也就是SpringMVC层)
方法:
商品信息修改页面显示
商品信息修改提交
在ItemsController中添加如下代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
页面代码:
itemsList.jsp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
editItems.jsp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
深入分析Controller层的内容
1.@RequestMappring注解的作用:
1.URL路径映射
@RequestMapping(value=”/item”)或@RequestMapping(“/item)
value的值是数组,可以将多个url映射到同一个方法
2.窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:
@RequestMapping放在类名上边,设置请求前缀
@Controller
@RequestMapping(“/item”)
方法名上边设置请求映射url:
@RequestMapping放在方法名上边,如下:
@RequestMapping(“/queryItem “)
访问地址为:/item/queryItem
3.限定http请求的方式
- 限定GET方法
- 1
- 1
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported
例如:
- 1
- 1
- 限定POST方法
- 1
- 1
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported
- GET和POST都可以
- 1
- 1
2.controller类中方法的返回值:
1.返回ModelAndView
需要方法结束时,定义ModelAndView,将model和view分别进行设置。
2.返回String
如果controller方法返回string,
表示返回逻辑视图名。
真正视图(jsp路径)=前缀+逻辑视图名+后缀redirect重定向
需求:商品修改提交后,重定向到商品查询列表。
redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)forward页面转发
通过forward进行页面转发,浏览器地址栏url不变,request可以共享。
3.返回void
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
使用request转向页面,如下:
request.getRequestDispatcher(“页面路径”).forward(request, response);也可以通过response页面重定向:
response.sendRedirect(“url”)也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding(“utf-8”);
response.setContentType(“application/json;charset=utf-8”);
response.getWriter().write(“json串”);
3.参数绑定
参数绑定的过程:
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。
springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变量接收(这是struts2的接收方式)!
1.默认支持的参数类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
1.HttpServletRequest
通过request对象获取请求信息
2.HttpServletResponse
通过response处理响应信息
3.HttpSession
通过session对象得到session中存放的对象
4.Model/ModelMap
ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据。
作用:将model数据填充到request域。
如下:
页面通过${itemsCustom.XXXX}获取itemsCustom对象的属性值。
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。
2.简单类型
包括整型、字符串、单精度和双精度、布尔型。
eg:
请求该controller方法的url为:http://localhost:8080/Spring_mybatis/items/editItems.action?id=1
注意:url中的参数的名字必须与controller方法中的形参的参数名相同。如果不同就不会映射成功。
需求:解决url中的参数名如果和controller方法中的形参的参数名不同时,也可以映射成功的问题
通过@RequestParam对简单类型的参数进行绑定。
如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。
如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。
通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误:
错误信息:
- 1
- 1
@RequestParam小结:
value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;
defaultValue:默认值,表示如果请求中没有同名参数时的默认值
定义如下:
- 1
- 2
- 3
- 1
- 2
- 3
形参名称为id,但是这里使用value=” item_id”限定请求的参数名为item_id,所以页面传递参数的名必须为item_id。
注意:如果请求参数中没有item_id将跑出异常:
- 1
- 1
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
3.pojo类型
1.简单pojo类型
如果页面中input的name和controller的pojo形参中的属性名称一致,springMVC会自动将页面中数据绑定到controller中的pojo对应的属性中。
如下:
editItems.jsp页面的属性name定义:
controller的pojo形参的定义:
Contrller方法定义如下:
需要说明的是:简单类型的参数绑定和pojo参数绑定互不影响。
2.包装pojo类型
如果页面中参数的名称和包装pojo类中的属性名一致,那么springMVC会自动将页面中数据绑定到controller中的pojo对应的属性中。
包装对象定义如下:
页面定义:
注意:页面中name的值(也就是itemsCustom)和包装pojo(也就是ItemsQueryVo)中的属性(也就是itemsCustom属性)一致,那么SpringMVC就自动将页面中传递过来的参数值映射到下面的Controller方法的形参中。
Controller方法定义如下:
4.集合类型绑定
1.数组的绑定
需求:商品批量删除,用户在页面选择多个商品,批量删除。
这里主要为了说明SpringMVC的集合类型绑定所以就只写表现层的实现了。
页面的定义:
controller类中方法的定义:
2.list的绑定
需求:通常在需要批量提交数据时,将提交的数据绑定到list中,比如:成绩录入(录入多门课成绩,批量提交),
本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。
表现层实现:
页面的定义:
editItemsQuery.jsp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
特别说明:
controller方法的定义:
1、进入批量商品修改页面(页面样式参考商品列表实现)
2、批量修改商品提交
使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>
属性
上面形参对象中需要添加的属性:
3.map的绑定
也通过在包装pojo中定义map类型属性。
在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。
包装类中定义Map对象如下:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
页面定义如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Contrller方法定义如下:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
5.自定义类型绑定
举例:自定义日期类型绑定
对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。
将请求日期数据串传成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。
所以自定义参数绑定将日期串转成Java.util.Date类型。
然后需要向处理器适配器中注入自定义的参数绑定组件。
自定义日期类型绑定组件:
配置方式1:
配置方式2:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
SpringMVC与Struts2的不同
- springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
- springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
- Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。
Post中文乱码问题
在@RequestMapping中设置http请求方式为post时的出现的中文乱码问题解决方式:
在web.xml中加入:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
以上可以解决post请求乱码问题。
对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:
- 1
- 1
另外一种方法对参数进行重新编码:
- 1
- 2
- 3
- 1
- 2
- 3
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
- SpringMVC注解开发(基础)---SpringMVC学习笔记(七)
- SpringMVC注解开发(基础)---SpringMVC学习笔记(七)
- SpringMVC学习笔记(七)
- SpringMVC学习(七)之ModelAttribute注解
- 【Spring+SpringMVC+MyBatis深入学习及搭建】15.SpringMVC注解开发(基础篇)
- SpringMVC学习笔记(三)使用IntelliJ IDEA开发Spring MVC HelloWorld(注解配置SpringMVC)
- SpringMVC学习笔记(七)处理异常
- springmvc学习笔记(五)开启注解
- springmvc学习笔记(六)注解优化
- springmvc学习笔记(基于注解实现)
- SpringMVC框架学习(注解开发)
- SpringMVC学习(三)--注解开发
- SpringMVC源码(九)SpringMVC注解开发
- springMVC 注解版(基础)
- springMVC-注解开发(上)
- springMVC初步学习(七)
- springMVC学习笔记七(基于注解方式的控制器的数据验证,类型转换和格式化)
- springmvc学习笔记(七)数据传递及乱码问题
- selenium学习过程中用到的资料链接
- C++ Traits(特征)和policy classes(策略类别)(8)---《C++ Templates》
- HDU4027 Can you answer these queries? (线段树单点更新 +优化)
- 前端chrome浏览器调试总结
- Ubuntu16.04 Tensorflow安装
- SpringMVC注解开发(基础)---SpringMVC学习笔记(七)
- HBase 默认配置
- android服务端与客户端
- Vasya is the beginning mathematician. He decided to make an important contribution to the science an
- js实现Div拖拽
- ActiveX控件属性:自定义属性的使用
- java 不规则二维数组的定义与输出 及 Arrays.fill(type[] A , type B)的用法 及 交换两行的方法
- Tomcat8.5源码分析-HostConfig
- HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)