SpringMvc

一、

第一步:发起请求到前端控制器(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文件

- 配置校验器

- 校验器注入到处理器适配器中

- 添加校验规则

- 错误信息文件

- 捕获错误信息

- 显示错误信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容

  • SpringMVC的工作原理图: SpringMVC流程 1、 用户发送请求至前端控制器DispatcherSer...
    Cherry300阅读 2,730评论 0 2
  • 来源:https://www.cnblogs.com/xiaoxi/p/6164383.html 一:Spring...
    程序员BUG阅读 372评论 0 5
  • SpringMVC的工作原理图: SpringMVC流程 1、 用户发送请求至前端控制器DispatcherSer...
    帅气人阅读 315评论 0 0
  • 许我一世光亮,却予我无尽荒凉 孤独辜负斟酌,如果拿火来喂饱我 在烈焰中涅槃重生保护这套躯壳 生死契阔最终沦为传说 ...
    e98c59136768阅读 140评论 0 0
  • 今天周二,没有课,所以约着房东办房租租赁证明。 拿着房租租赁证,证明信,落户通知书,身份证去了彭浦新村派出所,然后...
    花儿的博文阅读 210评论 0 0