龙空技术网

Springmvc跳转、静态资源、json处理

梦在飘扬475 90

前言:

当前兄弟们对“mvc接收json”大体比较关切,各位老铁们都想要剖析一些“mvc接收json”的相关知识。那么小编在网摘上搜集了一些关于“mvc接收json””的相关内容,希望小伙伴们能喜欢,姐妹们快快来了解一下吧!

跳转

跳转关键字 forward: redirect:

注意:返回值不写关键字时 默认是转发跳转

返回值写了关键字时,视图解析器不在为你拼接前后缀,写完整的跳转路径

1、C--->V

由C(控制器)跳转到页面V(视图)

@RequestMapping("/test1")public String test1(){    System.out.println("c--->v");    //重定向跳转   index.jsp    return "redirect:/index.jsp";    //转发跳转    /view/hello.jsp    //return "forward:/view/hello.jsp";}
2、C--->C

由由C(控制器)跳转到C(控制器)

@RequestMapping("/test2")public String test2(){    System.out.println("c--->c");    //转发跳转   /jump/test1               //return "forward:/jump/test1";    绝对路径,适用于跨类的跳转    //跳转到当前类下的路径为test1的方法中     //return "forward:/test1";         相对路径    //重定向到  /jump/test1                //return "redirect:/jump/test1";   绝对路径    return "redirect:/test1";         }
3、跳转细节

在增删改之后,为了防止请求重复提交,进行重定向跳转

在查询之后,可以做转发跳转

C---->C :增删改后衔接一个查询

C---->V:查询后衔接一个视图

4、JSP细节

不应该直接访问jsp,应该先过C,查到数据后,在转发jsp

可以将所有jsp都放入WEB-INF目录下,即可强制不接受外界直接访问,只能由C转发

传值

C得到数据后,转发V,并向V传递数据,进而V中可以渲染数据,让用户看到含有数据的页面

转发跳转(在一个请求中):Request作用域

重定向跳转(在一个会话中):Session作用域

1、获得Request和Session

<!--导入依赖--><!--=====================Servlet======================-->    <!--jstl支持-->    <dependency>      <groupId>javax.servlet.jsp.jstl</groupId>      <artifactId>jstl</artifactId>      <version>1.2</version>    </dependency>    <!--servlet编译环境-->    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>javax.servlet-api</artifactId>      <version>4.0.1</version>      <scope>provided</scope>    </dependency>    <!--jsp编译环境-->    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>jsp-api</artifactId>      <version>2.0</version>      <scope>provided</scope>    </dependency>    <!--=====================Servlet======================-->
@RequestMapping("test1")public String test1(HttpServletRequest request, HttpSession session){    request.setAttribute("name","张三");    session.setAttribute("age",19);    return "data";}
2、JSP中取值
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><html><body><h2>Hello World!</h2>${requestScope.name}--${sessionScope.age}</body></html>注意:1、requestScope和sessionScope可以忽略,这样的写法更加精确的取哪个作用域的值     2、EL表达式取作用域的值时页面显示的时${requestScope.name}--${sessionScope.age}       解决方法1:页面上加上 isELIgnored(是否忽略EL表达式)="false"       解决方法2:web.xml在<jsp-property-group>里设置一组jsp文件是否忽略EL
了解:Model, ModelAndView

ModelAndView:springmvc底层使用的一个类,封装了视图跳转的名称和传递的值

Model:视图技术有很多(jsp、velocity、freeMarker等等),有些视图可能取不到常用的作用域的值

Model中存值则避免了视图取不到作用域中值得问题,实现了视图和作用域之间得解耦。

@RequestMapping("test2")public String test2(Model model,HttpSession session){    model.addAttribute("name","张三");    session.setAttribute("age",29);    return "data";}@RequestMapping("test3")public ModelAndView test3(){    ModelAndView modelAndView = new ModelAndView();    modelAndView.setViewName("data");    modelAndView.addObject("name","张三");    modelAndView.addObject("age",19);    return modelAndView;}
静态资源
<!--tomcat中的web.xml全局配置文件--><!-- The default servlet for all web applications, that serves static resources--><servlet>    <servlet-name>default</servlet-name>    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping>

静态资源:html、js文件、css文件、图片文件

tomcat中有个全局的servlet:org.apache.catalina.servlets.DefaultServlet,专门用于处理静态资源问题。

但在springmvc的配置文件中DispatcherServlet也采用了"/"作为url-pattern,则项目中不会在使用全局的servlet,则静态资源不能完成访问

1、解决方案1

DispatcherServlet中的url-pattern使用其他的,例如 *.action

出现的问题:所有请求的结尾都要加上.action,比较麻烦

<servlet>    <servlet-name>mvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>mvc</servlet-name>    <url-pattern>*.action</url-pattern></servlet-mapping>
2、解决方案2
<!--在项目中  自动添加一个映射("/**":DefaultServletHttpRequestHandler)    请求进入前端后,会先匹配自定义的handler,如果没有匹配则进入DefaultServletHttpRequestHandler    DefaultServletHttpRequestHandler会将请求转发给tomcat中名为"default"的servlet    这个servlet就是tomcat中全局配置web.xml中处理静态资源的servlet    --><mvc:default-servlet-handler/>
JSON处理

springMVC默认的json解决方案选择是Jackson,所以只需要导入jackson的jar包,即可使用。

Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。

远古时代采用xml格式进行数据交换(重量级)

1、导入依赖

<!--jackson--><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-databind</artifactId>    <version>2.12.5</version></dependency>
2、@ResponseBody
@RequestMapping("test1")//将handler的返回值,转换成json,并将json响应给客户端@ResponseBodypublic User test1(){    System.out.println("test1");    return new User(1,"张三",true,new Date());}
3、日期格式化
public class User {    private Integer id;    private String name;    private Boolean gender;    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private Date registerTime;}//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//在日期上添加如上格式,就是一个拆装箱的过程。将数据交换时日期格式转换成自己想要的格式
4、FastJson
<!--导入fastjson依赖--><dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.78</version></dependency>
4.1、安装FastJson

由于springmvc默认支持的是Jackson,所以要想使用第三方json处理方案,让springmvc识别FastJsonHttpMessageConverter,必须加上如下配置:

<mvc:annotation-driven>    <mvc:message-converters>        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">            <!--声明转换类型:json-->            <property name="supportedMediaTypes">                <list>                    <!--顺序不能反,不然使用ie时会出现下载提示-->                    <value>text/html;charset=utf-8</value>                    <value>application/json;charset=utf-8</value>                </list>            </property>        </bean>    </mvc:message-converters></mvc:annotation-driven>
4.2、日期格式化
public class User {    private Integer id;    private String name;    private Boolean gender;    @JSONField(format = "yyyy-MM-dd HH:mm:ss")    private Date registerTime;}//@JSONField(format = "yyyy-MM-dd HH:mm:ss")//在日期上添加如上格式,就是一个拆装箱的过程。将数据交换时日期格式转换成自己想要的格式
5、@RestController

这是一个复合注解

相当于@Controller + @ResponseBody

@RestController@RequestMapping("json")public class JsonController {    @RequestMapping("test1")    //@ResponseBody    public User test1(){        System.out.println("test1");        return new User(1,"张三",true,new Date());    }    @RequestMapping("test2")    //@ResponseBody    public List<User> test2(){        System.out.println("test2");        List<User> users = Arrays.asList(new User(1, "张三", true, new Date()), new User(2, "李四", true, new Date()));        return users;    }}
6、@RequestBody

@RequestBody,接收json参数 (post请求)

<body><h2>Hello World!</h2><script src=";></script><script>    function abcc(){        $.ajax({            type:"post",            url:"${pageContext.request.contextPath}/json/test3",            data:'[{"gender":true,"id":1,"name":"张三","registerTime":"2021-11-16 15:14:09"},{"gender":true,"id":2,"name":"李四","registerTime":"2021-11-16 15:14:09"}]',            dataType:"json",            contentType:"application/json",            success:function (ret) {                console.log(ret);            }        });    }</script><input type="button" value="提交" onclick="abcc();"></body>
@RequestMapping("test3")//@ResponseBodypublic List<User> test3(@RequestBody List<User> users){    System.out.println("test3");    System.out.println(users);    List<User> users1 = Arrays.asList(new User(10, "张三", true, new Date()), new User(20, "李四", true, new Date()));    return users1;}

标签: #mvc接收json