SpringMvc

作者: AAnna珠 | 来源:发表于2019-05-06 20:06 被阅读0次

    一、

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

    - 配置校验器

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

    - 添加校验规则

    - 错误信息文件

    - 捕获错误信息

    - 显示错误信息

    相关文章

      网友评论

          本文标题:SpringMvc

          本文链接:https://www.haomeiwen.com/subject/xbzdoqtx.html