SpringMvc

简介

今天就正式学习SSM框架中的SpringMvc了,学到哪里就写到哪里,希望尽早学完!
要想学习SpringMvc就得先了解SpringMvc是什么,以及它的特点是什么,下面我就以自己的理解来说说什么是SpringMvc吧。
首先MVC设计模式分别表示Model:封装数据,View:视图,Controller:前端控制器
而SpringMvc框架是Spring的扩展模块,它属于SpringFrameWork的后续产品,主要在JavaEE的web层使用,其使用相对于以前的jsp+servlet和struts2更加方便简单,

SpringMvc的执行流程

SpringMvc的执行流程图首先由浏览器发送请求给web层,SpringMvc中的前端控制器会将这个请求拦截下来,然后再发送给处理器映射器请求查询相对应的方法,查询完毕后就返回给前端控制器,然后再由前端控制器将请求执行发送给处理器适配器,处理器适配器里面会有一个专门的处理器来执行这个请求,执行之后再返回ModelAndView对象给处理器适配器,再由处理器适配器返回给前端控制器,ModelAndView当中既有数据也有视图,然后前端控制器再将ModelAndView发给视图解析器请求解析视图,解析完毕后再返回view对象给前端控制器,拿到View对象后再将View对象发给视图,经过渲染再返回前端控制器,最后再返回给浏览器实现。

编写一个SpringMvc快速入门程序

1.首先创建一个web项目
2.导入SpringMvc相关jar包(就是spring的基础上多了一个mvc的包)
在这里插入图片描述

3.添加配置文件springmvc.xml
在这里插入图片描述
4.在web.xml中配置前端控制器

<!-- 配置SpringMVC前端控制器 -->
<servlet>
    <servlet-name>mySpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定SpringMVC配置文件 -->
    <!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mySpringMVC</servlet-name>
    <!-- 拦截所有请求,不包括jsp,包括.js.png.css    建议使用 -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

5.创建控制器
在这里插入图片描述

6.注解扫描

<!--注解扫描-->
<context:component-scan base-package="com.itlike"/>

7.创建resault.jsp
在这里插入图片描述

8.index.jsp页面跳转到resqult.jsp

@Controller
public class MyController {
    @RequestMapping("/first")
    public String show(){
        return"/resault.jsp";
    }
}

9.启动服务器就可以了

SpringMvc接收参数

1.request对象接收参数

@Controller
public class MyController {
    @RequestMapping("/first")
    public String show(HttpServletRequest request){
        String parameter = request.getParameter("id");
        String parameter1 = request.getParameter("name");
        System.out.println(parameter);
        System.out.println(parameter1);
        return"/resault.jsp";
    }
}

2.当请求参数与处理器参数名称保持一致时,会自动将请求参数与形参绑定

@RequestMapping("/first")
public String show1(Integer id,String name){
    System.out.println(id);
    System.out.println(name);
    return"/resault.jsp";
}

3.javaBean接收参数,要求对象属性与表单名称保持一致
在这里插入图片描述
在这里插入图片描述

@RequestMapping("/myform")
public String show2(User user){
    System.out.println(user);
    return"/resault.jsp";
}

4.使用数组接收参数
将多个值放到一个数组里面进行接收
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.包装类接收参数

这里写了个Dog类
在这里插入图片描述
需要把Dog封装到User类当中
在这里插入图片描述
只要在传参时.Dog类的对象就行了
在这里插入图片描述

6.List集合接收参数
想传多条宠物时,可以把这些宠物放到一个list集合里面
在这里插入图片描述
在这里插入图片描述

RequestMapping相关属性

1.value属性
可以同时设置多个路径共同访问对应方法
在这里插入图片描述
在这里插入图片描述
不管访问testRequestMapping1还是testRequestMapping2都会跳转到resalut.jsp页面当中去
在这里插入图片描述
在这里插入图片描述

2.method属性
用来设置映射的请求方式,默认post和get都可以,所以一般不用设置
在这里插入图片描述
在这里插入图片描述

请求方式要保持一致否则将不能访问
3.parames属性
必须设置对应的请求参数和请求值才能访问到对应的内容

4.headers属性
发送的请求头必须与设置的请求头相同时才能访问到对应的方法
在这里插入图片描述
这里就必须用着两种方式才能访问到,其他的都访问不到
5.ant风格地址
ant风格:请求路径的一种匹配方法
通配符:? ,一个?匹配一个字符
* , 匹配任意字符
**,匹配多重路径

PathVariable

rest风格:资源定位及资源操作的风格,不是协议可以遵循也可以不遵循
rest风格请求:
1.rest即Representational State Transfer(资源)表现层状态转换
2.用URL定位资源,用http描述操作
3.是目前最流行的一种互联网软件架构,它结构清晰,符合标准,易于理解,扩展方便,正得到越来越多的网站使用
4.使用POST,DELETE,PUT,GET对应CRUD操作
5.spring3.0开始支持rest风格请求
使用PathVariable接收RestFul风格参数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发送POST和DELETE请求
由于默认情况下form表单不接收POST和DELETE请求,所以我们需要将POST请求转换为PUT和DELETE请求
1.在web.xml当中配置过滤器

<!--    配置HiddenHttpMethodFilter过滤器-->
    <filter>
        <filter-name>hiddenmethod</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenmethod</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2.发送请求
name必须是_method,value表示put或者delete请求

<form action="${pageContext.request.contextPath}/testRest/200" method="post">
  <input type="hidden" name="_method" value="put">
  <input type="submit" value="测试put请求">
</form>

因为从TomCat8开始直接发送put到jsp当中也是不被支持的,所以我们需要重定向,如下就可以接收到put或delete请求了

@RequestMapping(value = "testRest/{id}",method = RequestMethod.PUT)
public String restPut(@PathVariable Integer id){
    System.out.println("testRest======"+id);
    return "redirect:/localresault";
}
@RequestMapping("localresault")
public String local(){
    return "/resault.jsp";
}

RequestHeader

在方法中接收请求头当中的信息:
在这里插入图片描述

cookievalue

用来接收浏览器发送过来的cookie值:
在这里插入图片描述

页面传值

上面我们学的传参都是从浏览器接收数据,下面我们就学习怎样将参数传到页面当中去
1.ModelAndView

@Controller
public class MyController {
    @RequestMapping("testModelAndView")
    public ModelAndView test(){
        ModelAndView modelAndView= new ModelAndView();
        //把数据写到request域当中
        modelAndView.addObject("name","itlike");
        modelAndView.setViewName("result.jsp");
        return modelAndView;
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.Model

@RequestMapping("testModel")
public String testModel(Model model){
    //把数据写到request域当中
    model.addAttribute("name","iklike0002");
    return "result.jsp";
}

在这里插入图片描述
在这里插入图片描述
3.ModelMap
是Model的父类,其使用方法与Model一样
在这里插入图片描述
3.addAttribute

@RequestMapping("testModel")
public String testModel(Model model){
    //把数据写到request域当中
    //以key-value添加
    model.addAttribute("name","iklike0002");
    //添加对象 以属性额类型首字母小写为键 添加属性
    Goods goods= new Goods();
    goods.setName("goods1");
    goods.setPrice("1000");

    model.addAttribute(goods);
    System.out.println(model.asMap());
    /*-----------------------------------*/
    /*
    * 将map中的内容复制到当前model中
    * 如果内容(key)相同会覆盖
    * */
    HashMap<String, Object> hm = new HashMap<>();
    hm.put("name","itlike0003");
    hm.put("host","100");
    model.addAllAttributes(hm);
    System.out.println(model.asMap());
    return "result.jsp";

}

4.@SessionAttributes(贴在类上面)

//把model当中key为value暂存到session当中
@SessionAttributes("name")

在这里插入图片描述
在这里插入图片描述
5.@SessionAttribute
使用@SessionAttribute来访问预先存在session会话当中的数据,如果没有则会报错

@RequestMapping("testSession2")
public String test1(@SessionAttribute("name") String name) {
    System.out.println(name);

    return "result2.jsp";
}

6.ModelAttribute
贴在方法前那么此方法就会在映射方法执行前调用

//此方法就会在映射方法执行前调用
@ModelAttribute
public void test4(){
    System.out.println("此方法调用了");
}

在这里插入图片描述

form标签与验证

在这里插入图片描述
传值的时候需要有具体的对象,不然就会报错,他会自动寻找key值为command的model对象

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm"  %>
<fm:form modelAttribute="user">
    <fm:input path="name" />
    <fm:input path="age"/>

</fm:form>
@RequestMapping("testview2/{id}")
public String testform(@PathVariable Integer id, Model model){
    User user = new User();
    user.setName("itlike");
    user.setAge("10002");
    model.addAttribute("user",user);
    System.out.println(id);
    return "/result.jsp";
}

在这里插入图片描述
一些功能:CheckBox,radiobook,select。。。。
在这里插入图片描述
在这里插入图片描述

@RequestMapping("testview2/{id}")
    public String testform(@PathVariable Integer id, Model model){
        User user = new User();

        String[] hobby = new String[]{"篮球","足球"};
        model.addAttribute("user",user);
//        model.addAttribute("command",user);
        System.out.println(id);

        ArrayList<Object> arrayList = new ArrayList<>();
        arrayList.add("篮球");
        arrayList.add("足球");
        arrayList.add("羽毛球");
        arrayList.add("乒乓球");
        model.addAttribute("allhobby",arrayList);

        ArrayList<Object> petList = new ArrayList<>();
        Pet pet1 = new Pet();
        pet1.setId(0);
        pet1.setName("猫");

        Pet pet2 = new Pet();
        pet2.setId(1);
        pet2.setName("鼠");

        Pet pet3 = new Pet();
        pet3.setId(3);
        pet3.setName("狗");

        petList.add(pet1);
        petList.add(pet2);
        petList.add(pet3);


        model.addAttribute("pet",petList);

        user.setName("itlike");
        user.setAge(10002);
        user.setGender(0);
        user.setHobby(hobby);
        user.setPet(pet3);


        return "/result.jsp";
    }

在这里插入图片描述
表单校验:
基本的校验
在这里插入图片描述
类上添加约束
在这里插入图片描述
接收的类上加上注解,把错误信息打印出来
在这里插入图片描述
在这里插入图片描述

静态资源访问

之前我们在web.xml里面写了<url-pattern>/</url-pattern>拦截所有请求,不包括jsp,包括.js.png.css,所以当我们在项目里放了一张log.png时,是访问不到的:在这里插入图片描述
在这里插入图片描述
我们有两种办法来解决:
1.在springmvc.xml里面添加:<mvc:default-servlet-handler />
作用:如果是静态资源就直接的去访问,如果不是静态资源就去找RequestMapping
2.采用spring自带的`mvc:resources方法

<mvc:resources mapping="/images/**" location="/images"/>

表示如果要访问images开头的路径就去当前项目下images文件夹中寻找,还可以改为js,css
这两种方法都能访问到静态资源,第二种方法是比较快的,在开发当中建议使用

json处理

1.导入jar包
在这里插入图片描述

2.在springmvc里面设置<mvc:annotation-driven/>
3.设置映射方法的返回值为@ResponseBody
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值