一、
第一步:发起请求到前端控制器(dispatcherServlet)
第二步:前端控制器请求handlerMapping查找handler,可以根据xml配置,注解进行查找
第三步:处理器映射器handlerMapping向前端控制器返回handler
第四步:前端控制器调用处理器适配器去执行handler
第五步:处理器适配器去执行handler
第六步:handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView,ModelAndView是SpringMVC框架的一个底层对象,包括Model和View
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图
第九步:视图解析器向前端控制器返回view
第十步:前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
二、mvc组件
1.前端控制器dispatcherservlet
作用:接收请求,响应结果,相当于转发器,中央处理器
有了前端控制器减少了其他组件之间的耦合度
2.处理器映射器HandlerMapping
作用:根据请求URL查询handler
3.处理器适配器handlerAdapter
作用:按照特定规则去执行handler
4.处理器handler(程序员开发)
注意:编写handler时按照handlerAdapter的要求去做,这样适配器才能正确执行Handler
5.视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图解析或者真正的视图view
6.视图view(需要程序员开发jsp)
view是一个接口,实现类支持不同的view类型(jsp、freemarker、pdf...)
三、注解开发步骤
创建web工程
导入jar包
在web.xml中配置dispatcherservlet
配置注解映射器和适配器
编写注解处理器
在Spring容器中加载处理器
编写视图
配置视图解析器
部署调试
四、@RequestMapping映射请求
1.使用@RequestMapping注解为控制器指定可以处理哪些URL请求
2.在控制器的类定义及方法定义处可标注。
2.1类定义处:提供初步的请求映射信息,相对WEB应用的根目录
2.2方法处:提供进一步的细分映射信息,相对于类定义出的url。若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用根目录
2.3DispathcherServlet截获请求后,就通过控制器上的@RequestMapping提供的映射信息确定请求所对应的处理方法
3.1@RequestMapping修饰类
``
@Controller
@RequestMapping(“items”)
public classItemController3{
@RequestMapping(“/queryItems”)
public ModelAndView queryItems()throws Exception{
``
3.2@RequestMapping修饰方法
3.2.1@RequestMapping除了可以使用请求url映射请求外。可以使用请求方法、请求参数及请求头映射请求
3.2.2@RequestMapping的value、method、params、heads分别表示请求url、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化
4.params和headers支持简单的表达式:
-param1:表示请求必须包含名为param1的请求参数
-!param1:表示请求不能包含名为param1的请求参数
-param1!=value1:表示请求包含名为param1的请求参数,但其值不能为value1
-{"param1=value1","param2"}:请求必须包含名为param1和param2的两个请求参数,且param1参数值必须为value1
··
//限制http请求方法,可以post和get
@RequestMapping(value="/editIttems",method=RequestMethod.GET,RequestMethod.POST)
public ModelAndView editItems() throws Exception{
ItemCustom itemCustom =itemCustom.findItemsById(1);
ModelAndView modelAndViewm=new ModelAndView();
modelAndViewm.addObject("itemsCustom",itemsCustom);
modelAndViewm.setViewName("/items/editItems");
return modelAndViewm;
}
@RequestMapping(value="/delete",method=RequestMethod.POST,params="userId")
public String test1(){
return "user/test1";
}
@RequestMapping(value="/show",headers="contentType=test/*")
public String test2(){
return "user/test2";
}
5.controller方法的返回值:返回ModelAndView,返回字符串,返回void
5.1返回ModelAndView
@RequestMapping("/queryItems")
public ModelAndView queryItem(HttpServletRequest request) throws Exception {
//测试请求转发时,共享request数据
System.out.print("测试request共享性"+request.getParameter(“id”));
//调用service查找数据,查询 商品列表
List<ItemsCustom> itemsList = new ArrayList<ItemsCustom>();
itemsList = itemsService.findItemsList(null);
// 创建modelAndView准备填充数据、设置视图
ModelAndView modelAndView = new ModelAndView();
// 填充数据
modelAndView.addObject("itemsList", itemsList);
// 指定视图
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
5.2Controller返回字符串
-2.2.1表示返回逻辑视图名
@RequestMapping("/editItems",method={RequestMethod.POST,RequestMethod.GET)
public String editItems(Model model) throws Exception {
//调用service根据商品id查询商品信息
ItemsCustom itemsCustom=itemsCustom.findItemsById(1);
//通过形参中的model将model数据传到页面
//相当于modelAndView.addObject方法
model.addAttribute("itemsCustom",itemsCustom);
return "items/editItems";
}
-redirect重定向
redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因此重定向后重新进行request(request无法共享)
//重定向到商品查询列表
return“redirect:queryItems.action”;
-forward页面转发
通过forWord进行页面转发,浏览器地址栏url不要,request可以共享。
//页面转发
return “forward:queryItems。action”;
5.3返回void
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
5.3.1使用request转向页面,如:
request。getRequestDispatcher("页面路径”)。forward(request,response);
5.3.2可以通过response页面重定向:
response。sendRedirect("url")
5.3.3可以通过response指定响应结果。例如响应json数据如下:
response.setCharcterEncoding("utf-8");
response.setContentType("application/json.charset=utf-8");
response.getWrite().Write("json串“);
五、绑定
1.处理器形参中可添加的参数类型,①HTTPServletRequest,②HTTPServletResponse③HTTPSession④Model/ModelMap
2.简单类型绑定
通过@RequestParam对简单类型进行绑定。
2.1@RequestParam的参数
- value=" "入参的请求参数的名字
- value=“item_id”请求的参数中的名字为item_id的参数值传入
- required是否必须,默认是true
- defaultValue默认值
2.2pojo绑定
<td><input type="text" name="name" value="${itemsCustom.name}"/></td>
public class Items{
private String name;
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(HttpServletRequest request,int id,ItemsCustom itemsCustom ) throws Exception{
itemsService.updateItems(id,itemsCustom);
3.包装pojo类型绑定
将pojo对象作为一个包装对象的属性,controller方法中以该包装对象作为形参。
public class ItemsQueryVo{
private Items items ;
private ItemsCustom itemsCustom ;
<td>商品名称<input type="text" name="itemCustom.name/></td>
@RequestMapping("/queryItems")
public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo ) throws Exception{
List<itemsCustom> itemsList =new ArrayList<itemsCustom>();
itemsList = itemsService.findItemsList (itemsQueryVo);
六、校验
SpringMVC使用hibernate的校验框架validation。
数据校验步骤:
- 导入校验jar文件
- 配置校验器
- 校验器注入到处理器适配器中
- 添加校验规则
- 错误信息文件
- 捕获错误信息
- 显示错误信息
网友评论