SpringMVC框架学习(一)

一、SpringMVC概述

1) Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的
MVC 框架之一
2)Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
3)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任
何接口。
4)支持 REST 风格的 URL 请求。
5)采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

环境搭建

在这里插入图片描述
配置好我们的Tomcat
在这里插入图片描述
然后我们在生成的web.xml中配置SpringMVC的前端控制器:DispatcherServlet

    <!-- Springmvc的前端控制器 / 核心控制器:  DispatcherServlet -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 给DispatcherServlet配置初始化参数:
                指定Springmvc的核心配置文件
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>

        <!--
            load-on-startup: 设置DispatcherServlet在服务器启动时加载。
                Servlet的创建时机:
                     1. 请求到达以后创建
                     2. 服务器启动即创建
         -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 指定请求的匹配 -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

然后再来配置springMVC.xml

	<!--组件扫描-->
	<context:component-scan base-package="helloworld"></context:component-scan>

	<!--2.视图解释器-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"/>
	</bean>

然后依据我们创建的SpringMVC.xml来对应的创建views文件夹

书写我们的第一个程序

首先创建一个请求处理器,让我们后面写的jsp可以产生一种映射,就比如说是到另一个页面

@Controller
public class SpringMVCHandler {
//    处理客户端的请求:http://localhost:8888/Springmvc/hello

//    请求刚才发送的hello请求的映射,href里的那个
    @RenderMapping(value = "/hello")
    public String handleHello(){
        System.out.println("hello ~");
        /**
         * 当请求完成之后要给客户端一个相应
         * 也就是return一个字符串,而字符串所代表的就是前往一个return的字符串的页面
         * 此时就要用到视图解释器了
         *
         * 通过视图解释器解析得到具体的视图,再转发去往该视图
         */
        return "success";

    }
}

这个return返回的字符串会自动寻找同名的jsp文件进行映射,然后我们在views的视图文件夹里创建我们的映射界面success.jsp

<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>Success jps.</h1>
</body>
</html>

只是一个简单的映射
在这里说一下原理:
我们书写的index.jsp对页面发送请求的时候

<!-- 指定请求的匹配 -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

中的url-pattern会自动匹配接收到的请求种类,然后接受请求,把请求转交给DispatcherServlet,这时就会读取springmvc.xml,进而创建好对应的springmvc容器对象,同时springmvc.xml的组件扫描器会扫描到我们创建的@Controller和@RequestMapping注解,能得到具体的请求与请求处理器中方法的映射。

作者错误总结:第一次调试的时候可以加载出localhost:8888/index.jsp界面,但是跳转窗口会404,错误原因。prefix的路径写错,views后少一个斜杠,导致页面接收message错误。

二、SpringMVC入门

1.@RequestMapping的作用

(1)value的路径累加原则

当我们在类名添加@RequestMapping注解的时候,它所填的路径名是要加在方法的@RequestMapping前面的,然后要在index.jsp里面做反射的时候把路径写全才能做映射。
在这里插入图片描述
在这里插入图片描述

(2)method的映射请求方法

在value后面可以以逗号的形式注明method请求方法

@RequestMapping(value = "/testMethod/",method = RequestMethod.GET)
    public String testMethod(){
        return "success";
    } 

我们这里用来举例的都是超链接,所以是get请求,如果在method那里写post请求就会报405请求方式不支持的错误,所以为了防止这种错误,也可以这样写:

@RequestMapping(value = "/testMethod/", method = {RequestMethod.GET,RequestMethod.POST})

或者以按钮的形式,进行post请求

<form action="/spring/testMethod/"method="post">
          <input type="submit" value="弹射">
      </form>
(3)params设置请求参数
/**
    * params
    */
   @RequestMapping(value = "/params",params = {"username","age"})
   public String param(){
       return "success";
   }
<a href="/spring/params?username&age">params</a>

如果想提交申请的时候不含有这个参数,或者参数能等于这个值,可以在参数之前加一个叹号
原理,只有当index.jsp内a标签内的值或者参数列表和方法的@RequestMapping吻合的时候才能通过请求

(4)Headers

我们申请提交的网页都会有一个Headers信息,写爬虫的人应该会很清楚,headers中有很多的列表,所以,这也可以成为我们提交申请的一种,当页面含有headers所包含的值,才能跳转页面。

    /**
    * params and Headers
    */
   @RequestMapping(value = "/params",params = {"username","age"},headers = "Accept-Language")
   public String paramAndHeaders(){
       return "success";
   }
(5)RequestMapping映射请求占位符PathVariable注解

在RequestMapping里面表明地址信息的时候用用户信息做占位符,然后PathVariable标明信息的类型,最后到index.jsp中写明具体信息,完成映射。

/**
    * PathVariable
    */
   @RequestMapping(value = "/PathVariable/{username}/{id}")
   public String PathVariable(@PathVariable("username")String username,@PathVariable("id")Integer id){
       return "success";
   }
<a href="/spring/PathVariable/Zzz/101">PathVariable</a>

2.Rest

<1>.概述
(1)URL风格

示例:
order/1 HTTP GET :得到 id = 1 的 order
order/1 HTTP DELETE:删除 id = 1的 order
order HTTP PUT:更新order
order HTTP POST:新增 order

(2)HiddenHttpMethodFilter

浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不
支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使
得支持 GET、POST、PUT 与 DELETE 请求。

(3)HiddenHttpMethodFilter工作机制

在这里插入图片描述

<2>搭建
    <!-- 配置REST 过滤器  HiddenHttpMethodFilter
           将满足转换条件的请求进行转换.
         1. 必须是post请求
         2. 必须要通过_method能获取到一个请求参数值(要转换成的请求方式)
    -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
<3>四种请求的举例
    /**
     * REST POST
     */
    @RequestMapping(value = "/order",method = RequestMethod.POST)
    public String testPOST(){
        return "success";
    }
    /**
     * REST PUT
     */
    @RequestMapping(value = "/order",method = RequestMethod.PUT)
    public String testPUT(){
        return "success";
    }
    /**
     * REST DELETE
     */
    @RequestMapping(value = "/order/{id}",method = RequestMethod.DELETE)
    public String testDELETE(@PathVariable("id")Integer id ){
        return "success";
    }
    /**
     * REST GET
     */
    @RequestMapping(value = "/order/{id}",method = RequestMethod.GET)
    public String testGET(@PathVariable("id")Integer id){
        return "success";
    }
  <!--只有put和delete才需要隐藏域,意思就是一个name的标签为_method的会进行转换操作 -->
  <!--添加一个订单-->
  <form action="/spring/order" method="post">
      <input type="submit" value="POST">
  </form>
  <!--修改一个订单-->
  <form action="/spring/order" method="post">
      <input type="hidden" name="_method" value="PUT">
      <input type="submit" value="PUT">
  </form>
  <!--删除id为1001的订单-->
  <form action="/spring/order/1001" method="get">
      <!--隐藏域-->
      <input type="hidden" name="_method" value="DELETE">
      <input type="submit" value="DELETE">
  </form>
  <!--查询id为1001的订单-->
  <form action="/spring/order/1001" method="get">
      <input type="submit" value="GET">
  </form>

3.处理请求数据

1) Spring MVC 通过分析处理方法的签名,HTTP请求信息绑定到处理方法的相应人参中。
2) Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。
3) 必要时可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)、
4) Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

<1>@RequestParam

作用:映射请求参数到请求处理方法的形参

<a href="testRequestParam?username=Tom&age=22">testRequestParam</a>

这里提供了两个参数一个是username一个是age,从前我们需要在RequestMapping内给一个params参数,一个headers来进行网页的映射,现在只需要使用RequestParam就可以了

   /**
     * RequestParam
     * 1.如果请求参数名和形参名一致,则可以省略@RequestParam的指定
     * 2.@RequestParam 注解标明的形参必须要赋值,必须要从请求对象中获取到对应的请求参数
     * 也可以使用required来设置成不必须的
     * 3.假设这个值没给他传,就可以使用defaultValue来设定一个默认值取代本应该的null
     *
     * 客户端的请求:testRequestParam?uesrname=Tom&age=22
     * 携带两个请求参数
     * @return
     */
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(value = "username", required = false, defaultValue = "张章")String username,
                                   @RequestParam("age")Integer age){
        return "success";
    }
}
<2>@RequestHeader
    /**
     * @RequestHeader 映射请求头信息到请求处理方法的形参中
     */
    @RequestMapping(value = "/RequestHeader")
    public String testRequestHeader(@RequestHeader("Accept-Language")String accentlanguage){
        return "success";
    }
<a href="testRequestHeader"></a>

每一个申请的网页都会携带一个headers的请求,对那里的信息进行一次信息的挑选就可以了,另外这个RequestHeader的三种用法和QuestMapping一样,就不多写了。

<3>@CookieValue
    /**
     * @CookieValue
     */
    @RequestMapping(value = "/testCookieValue")
    public String testCookieValue(@RequestHeader("JSESSIONID") String session){
        return "success";
    }

当我们申请网页的时候回自动生成一个JSESSIONID,而这个CookieValue就是通过这个进行检验的。

<4>使用POJO作为参数

1) 使用 POJO 对象绑定请求参数值
2) Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等

  <!--模拟一个注册-->
  <form action="/testPOJO" method="post">
      用户姓名:<input type="text" name="username">
      <br>
      用户密码:<input type="password" name="password">
      <br>
      用户性别:男<input type="radio" name="gender" value="1"><!--单选radio--><input type="radio" name="gender" value="0">
      <br>
      <!--支持级联的方式-->
      用户省份:<input type="text" name="address.province">
      <br>
      用户城市:<input type="text" name="address.city">
      <br>
      <input type="submit" name="注册"/>
  </form>
/**
     * testPOJO
     */
    @RequestMapping(value = "/testPOJO")
    public String testPOJO(User user){
        System.out.println(user.toString());
        return "success";
    }
 @Controller
public class User {
    private String username;

    private String pssword;

    private String email;

    private Integer gender;

    private Address address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPssword() {
        return pssword;
    }

    public void setPssword(String pssword) {
        this.pssword = pssword;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", pssword='" + pssword + '\'' +
                ", email='" + email + '\'' +
                ", gender=" + gender +
                ", address=" + address +
                '}';
    }
}
@Controller
public class Address {

    private String province;

    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

4.处理相应数据

(1)ModelAndView
<!--ModelAndView-->
  <a href="/testModelAndView">testModelAndView</a>
    /**
     * @ModelAndView
     * @return
     */
    @RequestMapping(value = "/testModelAndView")
    public ModelAndView mAV(){
        //模型数据:username=Admin
        ModelAndView mav = new ModelAndView();
        //添加模型数据
        mav.addObject("username", "Admin");
        //设置视图信息
        mav.setViewName("view");
        return mav;
    }

所有被modelAndView添加的模型数据都会存入request域中,然后提交申请,再用视图界面显示提交的参数。

<body>
    <h1>Welcome</h1>
    username:${requestScope.username}

</body>

(2)Map
    /**
     * @ModelAndView
     * @return
     */
    @RequestMapping(value = "/testMap")
    public String testmap(Map<String,Object> map){
        //模型数据=123456
        map.put("username", "admin");
        map.put("password", 123456);
        return "view";
    }

以map的形式存放到request域

(3)Model
    /**
     * Model
     */
    @RequestMapping("/testModel")
    public String testModel1(Model model){
        //模型数据:loginMsg=用户名或者密码错误
        model.addAttribute("loginMsg", "用户名或者密码错误");
        return "view";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值