SpringMVC映射规则

https://www.jianshu.com/p/fbc6953e5af4

二级映射
在类上和方法上同时注解@RequestMapping,相当于地址栏里有两级的地址。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("one")
public class TestController {
    @RequestMapping("two")
    public String test(){
        return "index";
    }
}

//如上注解后,映射地址为:http://localhost:8080/xx/one/two

Method类型选择接受
@RequestMapping注解括号里,有method属性作为对提价类型的选择接受

@RequestMapping(value="/getName",method={RequestMethod.GET, RequestMethod.POST})
//如果没有指定method,则默认为所有请求类型都接受

参数规则匹配
在响应请求的时候,对提交的参数规则进行验证,如果不符合设置的规则,则不接受请求

param1=value1 - 请求中必须包含该参数和指定值
param2 - 请求中必须包含该参数,值任意
!param3 - 请求中必须不包含该参数

@RequestMapping(value="/getName",method=RequestMethod.GET,params={"id=123","name","!age")
//上述规则定义了,只能响应get请求,并且请求的参数必须包含id=123,必须包含name,不能包含age
//根据上述规则此地址合法:http://localhost:8080/xx?id=123&name=abc

参数绑定的含义
1.所谓的参数绑定,就是怎么样获取到前台页面传过来的值,通常是跟据参数名(key)来获取值;
绑定页面传值的key值到映射方法的参数上,如下程序所示

//页面端提交请求的程序
$.post("../hc.v",
    {
        name : "shoji",
        price : "8888"
    },
    function(d) {
        alert(d);
    }
)
//后台响应上面ajax的post请求的代码
//通过两段代码里“name”和“price”的相同,把“shouji”和“8888”传到hc方法里
//问号传值的方式同样适用    ?name=shoji&price=8888
...
@RequestMapping("hc")
public String hc(String name,String price){
    return "test";
}
...

2.用标准PO属性来进行绑定
页面端提交请求的js代码同上

//新建一个标准的PO,同时当前类的属性名应该跟前台代码里的KEY对应上 public class PO{ private String name;//和key值一样 private Stirng price;//和key值一样 //省略各自的set get } //后台响应上面ajax的post请求的代码 //通过PO里的“name”和“price”属性名和前台js代码里的key相同,把“shouji”和“8888”传到hc方法里 //问号传值的方式同样适用 ?name=shoji&price=8888作者:_NineSun旭_
链接:https://www.jianshu.com/p/fbc6953e5af4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
...
@RequestMapping("hc")
public String hc(PO po){
    //po.getName() 取出shoujie
    //po.getPrice() 取出8888
    return "test";
}
...

3.用注解@RequestParam来绑定
页面端提交请求的js代码同上

//后台响应上面ajax的post请求的代码 //通过注解里的“name”和“price”参数名和前台js代码里的key相同,把“shouji”和“8888”传到hc方法里 //问号传值的方式同样适用 ?name=shoji&price=8888
...
@RequestMapping("hc")
public String hc(@RequestParam("name") String p1,@RequestParam("price") String p2){
    //p1 取出shoujie
    //p2 取出8888
    return "test";
}
...

4.通过注解@PathVariable
本注解把要传给后台程序的值,绑定在地址里
页面端提交请求的地址变为:dianhua/name/shoji/price/8888

//后台响应上面ajax的post请求的代码
//@RequestMapping注解的映射改变,地址里值的部分用{}括起来
//在方法的参数上使用注解@PathVariable
//通过PathVariable注解后面的“idvalue”和“pricevalue”和RequestMapping注解里{}部分相同,把“shouji”和“8888”传到hc方法里

@RequestMapping("dianhua/name/{idvalue}/price/{pricevalue}")
public String hc(@PathVariable String idvalue,@PathVariable String pricevalue){
    //idvalue 取出shoujie
    //pricevalue 取出8888
    return "test";
}
...

映射方法的返回值类型
1.返回ModelAndView

<!-- springmvc配置文件代码片段 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
</bean>
@RequestMapping("/szw/jintiancailai") public ModelAndView ccc(String namee) { List list = new ArrayList(); list.add("zhiweizhi"); list.add("luchang"); System.out.println("hello name=" + namee); ModelAndView mav = new ModelAndView(); mav.addObject("myList", list); mav.addObject("mySize", "2"); mav.setViewName("first"); //first是一个页面文件的名字 //在springmvc的配置文件指定页面文件所在的路径是/WEB-INF/views/ //在springmvc的配置文件指定页面文件的类型是.jsp //我们ModelAndView所展示的页面会做如下解析 prefix+setViewName+suffix //即 /WEB-INF/views/first.jsp return mav;

ModelAndView是springmvc框架提供一个包装界面jsp文件的类,常用的方法addObject和setViewName
addObject有两个参数,类型都是Object类型,第一个参数是key,第二个参数是值;主要用途,把java后的里的数据带到前台jsp页面上
setViewName有一个参数,类型是String;参数是jsp文件的名字;用途是告诉ModelAndView所展示的页面是哪个jsp文件。
2.返回值是String
返回值里只有一个字符串

public String ddd() {
    return "first";
}
//这样返回同上面程序注释的过程

redirect和forward在返回值字符串前,并且redirect和forward和字串之间有一个冒号

public String eee() { return "redirect:../first.jsp"; } public String fff() { return "forward:../first.jsp"; } //这样返回,我们转去的地址不在被springmvc管理,需要转去的地址能直接在地址栏访问

@ResponseBody注解
当返回值是String,并且方法上方有此注解时,返回的字符串将不在被解析为springmvc的视图(即jsp文件),会被直接以字符串展示在浏览器里。

@RequestMapping("/test")
@ResponseBody
public String hhh() {
    return "first";
}
//first将被输出到浏览器里

返回时void
需要人为在方法的参数列表里,加入request和response这两个参数,所有的操作依靠这两个参数来完成,非常类似标准的Servlet.
Ajax和Controller的交互
传入key-value键值对,输出json
1.在ajax的提交请求里,传给后台的数据格式是kv对

//$.ajax $.post $.get 都是jquery的请求,需要引入jquery.js
//$.post和$.get都是$.ajax的简写方式
    $.ajax({
        type : "post",
        url : "../tm.v",
        contentType:"application/json; charset=utf-8",//请求成功后,后台返回的数据格式,即success : function(r)里“r”的格式
        data : "name=shoji&price=8888",//此处就是标题中提到的传入key-value键值对
        success : function(r) {
            //r 直接就是jsonObject
            alert(r.name);
        }
    })

2.在controller的方法返回值里,传给前台的数据格式是json

@RequestMapping("tm")
    @ResponseBody
    public BYQ tm(BYQ byq2){
        System.out.println(byq2.getName());
        System.out.println(byq2.getPrice());
        return byq2;
    }

传入json,输出json
1.在ajax的提交请求里,传给后台的数据格式是json串

$.ajax({
        type : "post",
        url : "../tm.v",
        contentType:"application/json; charset=utf-8",
        data:'{"name":"shouji","price":"8888"}',//此处就是标题中提到的传入的json格式串
        success : function(r) {
            //r 直接就是jsonObject
            //如果返回的r是字符串,在调用r.price之前需要把字符串转为json对象,var jsonObject = JSON.parse(r);
            alert(r.price);
        }
    })

2、在controller的方法返回值里,传给前台的数据格式是json,并且在方法的参数里接收的也是json串

//@ResponseBody注解和方法的返回值被置为BYQ,是为了返回值是json格式
//@RequestBody注解和方法的参数是BYQ类型,是为了接收前台提交过了的json格式
    @RequestMapping("tm")
    @ResponseBody
    public BYQ tm(@RequestBody BYQ byq2){
        System.out.println(byq2.getName());
        System.out.println(byq2.getPrice());
        return byq2;
    }

restful

简介
体现在浏览器地址;每一个地址代表一种后台的资源(实例),地址里不能出现动词,具体的功能操作用提交method的类型来区分。
映射模板
传统方式:http://localhost:8080/ssm/updateuser?id=123

restful: http://localhost:8080/ssm/user/123 通过这个地址看不出是增删改,具体操作下面来对应。
提交方法类型对应(method的值)
get - 查询

post - 修改

put - 添加

delete - 删除
springmvc里对restful的支持
通过注解@PathVariable来支持rest风格的地址,详见

springmvc4以上的版本,提供注解@RestController来支持。
当SpringMVC映射为/时,不需要被映射的地址处理方式
映射为/,即在web.xml中引入springmvc时,url-pattern标签的值为/,即网站下所有地址都被mvc拦截。

...
  <servlet>
    <servlet-name>springmvcservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:mymvc.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvcservlet</servlet-name>
    <url-pattern>/</url-pattern><!-- 被标识为/ -->
  </servlet-mapping>
<!-- 地址被全部拦截后,出现的问题是,.js、.css、图片文件等等静态资源文件都被拦截了,不能直接访问 -->
  ...

解决静态资源被拦截的方法之一,在SpringMVC的配置文件中加入下面代码

<!-- 地址里含有js和img的,都不被springmvc拦截 -->
    <mvc:resources location="/js/" mapping="/js/**"/>
    <mvc:resources location="/img/" mapping="/img/**"/>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC的路径映射主要通过@RequestMapping注解来实现。在Spring MVC中,可以使用多种注解来定义路径映射规则,其中包括@Controller、@RequestMapping、@GetMapping等。 @Controller注解用于标识一个类是控制器,可以处理请求并返回相应的结果。在控制器类中,可以使用@RequestMapping注解来定义请求路径的映射规则。例如,在示例中的HelloController类中,使用@RequestMapping("/user")注解来指定该控制器的基础请求路径为"/user"。 @RequestMapping注解除了可以定义类级别的请求路径外,还可以在方法级别上定义具体的请求路径。例如,在HelloController类中,使用@RequestMapping(path = "/hello", method = {RequestMethod.POST})注解来定义了一个请求路径为"/hello"且请求方法为POST的方法。 另外,Spring MVC还提供了一种简化的路径映射注解,如@GetMapping注解。这些注解是@RequestMapping注解的缩写形式,用于定义特定请求方法的映射规则。例如,@GetMapping注解可以替代@RequestMapping注解中的method参数为RequestMethod.GET,用于定义GET请求的路径映射规则。 综上所述,Spring MVC的路径映射可以通过@Controller、@RequestMapping、@GetMapping等注解来定义,而具体的映射规则可以根据实际需求来选择不同的注解进行配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringMVC 路径映射](https://blog.csdn.net/qq_44713454/article/details/108145304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [spring mvc路径映射](https://blog.csdn.net/sunyaoxjtu/article/details/102832923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值