SpringMVC进阶(二)

来源:互联网 发布:mac下html5开发工具 编辑:程序博客网 时间:2024/06/03 15:39
商品修改功能开发
1.需求
操作流程:
1.1、进入商品查询列表页面
1.2、点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询)
要修改的商品从数据库查询,根据商品id(主键)查询商品信息

1.3、在商品修改页面,修改商品信息,修改后,点击提交

2 开发mapper
mapper:
根据id查询商品信息
根据id更新Items表的数据
不用开发了,使用逆向工程生成的代码。

3 开发service
接口功能:
根据id查询商品信息
修改商品信息

//根据id查询商品信息
public ItemsCustom findItemsById(Integer id) throwsException;
//修改商品信息
public void updateItems(Integer id,ItemsCustom itemsCustom)throws Exception;


@Autowired
private ItemsMapper itemsMapper;

@Override
public ItemsCustom findItemsById(Integer id) throws Exception{
Items items = itemsMapper.selectByPrimaryKey(id);
//中间对商品信息进行业务处理
//....
//返回ItemsCustom
ItemsCustom itemsCustom = new ItemsCustom();
//将items的属性值拷贝到itemsCustom
BeanUtils.copyProperties(items, itemsCustom);
return itemsCustom;
}

@Override
public void updateItems(Integer id, ItemsCustom itemsCustom)throws Exception {
//添加业务校验,通常在service接口对关键参数进行校验
//校验 id是否为空,如果为空抛出异常
//更新商品信息使用updateByPrimaryKeyWithBLOBs根据id更新items表中所有字段,包括大文本类型字段
//updateByPrimaryKeyWithBLOBs要求必须转入id
itemsCustom.setId(id);
itemsMapper.updateByPrimaryKeyWithBLOBs(itemsCustom);
}



4 开发controller
方法:
商品信息修改页面显示
商品信息修改提交


@RequestMapping("/editItems")
限制http请求方法,可以post和get
@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
public ModelAndView editItems()throws Exception {
//调用service根据商品id查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(1);
// 返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//将商品信息放到model
modelAndView.addObject("itemsCustom", itemsCustom);
//商品修改页面
modelAndView.setViewName("items/editItems");
return modelAndView;
}
//商品信息修改提交
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(HttpServletRequestrequest,Integer id,ItemsCustom itemsCustom)throws Exception {
//调用service更新商品信息,页面需要将商品信息传到此方法
itemsService.updateItems(id, itemsCustom);
//重定向到商品查询列表
// return "redirect:queryItems.action";
//页面转发
//return "forward:queryItems.action";
return "success";
}





@RequestMapping
url映射
定义controller方法对应的url,进行处理器映射使用。


窄化请求映射
//为了对url进行分类管理 ,可以在这里定义根路径,最终访问url是根路径+子路径
//比如:商品列表:/items/queryItems.action
@RequestMapping("/items")


限制http请求方法
出于安全性考虑,对http的链接进行方法限制。
如果限制请求为post方法,进行get请求,报错:

//限制http请求方法,可以post和get
@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})






controller方法的返回值

返回ModelAndView
需要方法结束时,定义ModelAndView,将model和view分别进行设置。

返回string
如果controller方法返回string,

1、表示返回逻辑视图名。
真正视图(jsp路径)=前缀+逻辑视图名+后缀

@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
//@RequestParam里边指定request传入参数名称和形参进行绑定。
//通过required属性指定参数是否必须要传入
//通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
public String editItems(Modelmodel,@RequestParam(value="id",required=true) Integeritems_id)throws Exception {
//调用service根据商品id查询商品信息
ItemsCustom itemsCustom =itemsService.findItemsById(items_id);
//通过形参中的model将model数据传到页面
//相当于modelAndView.addObject方法
model.addAttribute("itemsCustom", itemsCustom);
return "items/editItems";
}





2、redirect重定向
商品修改提交后,重定向到商品查询列表。
redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)
//重定向到商品查询列表
return "redirect:queryItems.action";


3、forward页面转发
通过forward进行页面转发,浏览器地址栏url不变,request可以共享。
//页面转发
return "forward:queryItems.action";





返回void

在controller方法形参上可以定义request和response,使用request或response指定响应结果:
1、使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request,response);

2、也可以通过response页面重定向:
response.sendRedirect("url")

3、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");





12.1 spring参数绑定过程

从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。

springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收!!!!


客户端请求
key/value

处理器适配器调用springmvc提供参数绑定组件将key/value数据转成controller方法的形参

参数绑定组件:在spirngmvc早期版本使用PropertyEditor(只能将字符串传成java对象)
后期使用converter(进行任意类型的传换)
spirngmvc提供了很多converter(转换器)
在特殊情况下需要自定义converter
对日期数据绑定需要自定义converter


controller方法(形参)




默认支持的类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
1 HttpServletRequest
通过request对象获取请求信息
2 HttpServletResponse
通过response处理响应信息
3 HttpSession
通过session对象得到session中存放的对象
4 Model/ModelMap
model是一个接口,modelMap是一个接口实现 。
作用:将model数据填充到request域。


简单类型

1 整型
public String editItem(Model model,Integer id) throwsException{
2 字符串
例子略

3 单精度/双精度
例子略

4 布尔型
处理器方法:
public String editItem(Model model,Integer id,Boolean status)throws Exception

请求url:
http://localhost:8080/springmvc_mybatis/item/editItem.action?id=2&status=false

说明:对于布尔类型的参数,请求的参数值为true或false。



通过@RequestParam对简单类型的参数进行绑定。
如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。

通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误:

SpringMVC进阶(二)


//@RequestParam里边指定request传入参数名称和形参进行绑定。
//通过required属性指定参数是否必须要传入
//通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
public String editItems(Modelmodel,@RequestParam(value="id",required=true) Integeritems_id)throws Exception





pojo绑定
页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。



post乱码
在web.xml添加post乱码filter

在web.xml中加入:
《filter》
《filter-name》CharacterEncodingFilter《/filter-name》
《filter-class》org.springframework.web.filter.CharacterEncodingFilter《/filter-class》
《init-param》
《param-name》encoding《/param-name》
《param-value》utf-8《/param-value》
《/init-param》
《/filter》
《filter-mapping》
《filter-name》CharacterEncodingFilter《/filter-name》
《url-pattern》/*《/url-pattern》
《/filter-mapping》

以上可以解决post请求乱码问题。
对于get请求中文参数出现乱码解决方法有两个:

修改tomcat配置文件添加编码与工程编码一致,如下:

《Connector URIEncoding="utf-8" connectionTimeout="20000"port="8080" protocol="HTTP/1.1" redirectPort="8443"/》

另外一种方法对参数进行重新编码:
String userName new 
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码





页面定义:
《td》商品名称《/td》
《td》《input type="text" name="name" value="${itemsCustom.name}"/》《/td》
《/tr》
《tr》
《td》商品价格《/td》
《td》《input type="text" name="price" value="${itemsCustom.price}"/》《/td》

controller的pojo形参的定义:
private Integer id;

    private Stringname;

    private Floatprice;



自定义参数绑定实现日期类型绑定

对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。
将请求日期数据串传成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。


import java.util.Date;
public class Items {
    private Integerid;

    private Stringname;

    private Floatprice;

    private Stringpic;

    private Datecreatetime;
所以自定义参数绑定将日期串转成java.util.Date类型。
需要向处理器适配器中注入自定义的参数绑定组件。



1 自定义日期类型绑定
public class CustomDateConverter implementsConverter《String,Date》{
@Override
public Date convert(String source) {
//实现 将日期串转成日期类型(格式是yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//转成直接返回
return simpleDateFormat.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果参数绑定失败返回null
return null;
}
}





《!-- 自定义参数绑定 --》
《!-- 转换器 --》
《property name="converters"》
《list》
《!-- 日期类型转换 --》
《beanclass="cn.itcast.ssm.controller.converter.CustomDateConverter"/》
《/list》
《/property》
《/bean》




springmvc和struts2的区别 

1、springmvc基于方法开发的,struts2基于类开发的。

springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。
方法执行结束,形参数据销毁。
springmvc的controller开发类似service开发。

2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。

0 0