Spring MVC汇总

1.返回值JSON、XML

//JSON
		<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
       //XML
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.1</version>
        </dependency>

导入对应的依赖包,@ResponseBody:被改注解所标记的请求处理方法将返回JSON格式或XML(如果配置了xml注解)的数据,绕开视图解析器

@XmlRootElement
public class Person {
    private String name;
    private Integer age;

    @XmlAttribute
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlAttribute
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

因为springmvc底层还是servlet,所以还必须添加serlvet依赖。

2.Controller接收参数以及乱码

get请求从tomcat8开始就不会乱码了
post请求要配置CharacterEncodingFilter

<filter>
        <filter-name>character</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>character</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Controller接收参数,可以多样化接收,不行的加上@RequestParam试试
@RequestParam的required属性默认为true,不传就会报400错,设置参数为可选的把required改为false

接收到的对象,不是null,属性是null,数组是null

@Controller
@RequestMapping("/test")
public class TestController {

    @GetMapping("/json")
    @ResponseBody
    public String testJson(Person p, String name, String age, @RequestParam Map<String,String> map){
        System.out.println(p);
        System.out.println(name);
        System.out.println(age);
        System.out.println(map);
        Person person = new Person();
        person.setName("jack");
        person.setAge(11);
        return "你好啊";
    }
}

返回值乱码,可以配置messageconverter,包括String,json,xml

	<mvc:annotation-driven >
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="defaultCharset" value="UTF-8"></property>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="defaultCharset" value="UTF-8"></property>
            </bean>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter">
                <property name="defaultCharset" value="UTF-8"></property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

也可以在Controller里设置

@GetMapping(value = "/json",produces = "text/html; charset=UTF-8")
    @ResponseBody
    public String testJson(@RequestParam Person p, @RequestParam(required = false) String name, String age)

3.前后端路径问题总结

@RequestMapping("/mv1")
    public ModelAndView mv(HttpServletRequest request){
        ModelAndView modelAndView = new ModelAndView("/page/person.jsp");
        Person person = new Person();
        person.setAge(12);
        person.setName("jack");
        //相当于request.setAttribute();
        modelAndView.addObject("person",person);
        return modelAndView;
    }

在java代码中,路径问题总结
1.假设请求路径是:http://IP地址:端口/context_path/path1/path2/path3
2.假设转发路径是:/page/test.jsp
以斜线( / )开头,参考路径就是context_path,http://IP地址:端口/context_path + /page/test.jsp
3.假设转发路径是:page/test.jsp
不以斜线(/)开头,参考路径是当前请求路径的上一层
所以最终转发路径直接替换:http://IP地址:端口/context_path/path1/path2/ + page/test.jsp

在jsp、html代码中,路径问题总结
1.假设请求路径是:http://IP地址:端口/context_path/path1/path2/path3
2.假设转发路径是:/page/test.jsp
以斜线( / )开头,参考路径就是http://IP地址:端口,http://IP地址:端口 + /page/test.jsp
不以斜线开头同上

4.springmvc中的转发和重定向

 @RequestMapping("/mv2")
    public String mv1(HttpServletRequest request){
        return "redirect:/page/person.jsp";
    }
    @RequestMapping("/mv1")
    public ModelAndView mv(HttpServletRequest request){
        ModelAndView modelAndView = new ModelAndView("redirect:/page/person.jsp");
        Person person = new Person();
        person.setAge(12);
        person.setName("jack");
        //相当于request.setAttribute();
        modelAndView.addObject("person",person);
        return modelAndView;
    }

重定向用redirect标识,转发和重定向都有String和ModelAndView两种,重定向其实是发了两次请求,所以数据不能共享,只能在路径后面拼接请求参数,但是ModelAndView的addObject会把简单的参数拼接,jsp通过request.getParameter或者${param.name}获取参数
注意和servlet不同,redirect的路径不需要加上context_path

5.PathVariable

@GetMapping("/json1/{age}")
    @ResponseBody
    public String testJson1(@PathVariable String age){//@PathVariable("age") String age
        System.out.println(age);
        Person person = new Person();
        person.setName("哈哈");
        person.setAge(11);
        return "你好啊";
    }

和@RequestParam类似,也有Required属性,默认为true

6.TomCat的2个默认Servlet和dispatchServlet和静态资源放行

可以在TOMCAT_HOME的conf/web.xml中找到
DefaultServlet:url-pattern是/,可以处理静态资源
JspServlet:url-pattern是*.jsp,处理jsp
springmvc配置的dispatchServlet,url-pattern/拦截了请求和静态资源
静态资源放行一:
将静态资源交还给tomcat的defaultServlet处理
<mvc:default-servlet-handler />
原理:通过DefaultServletHttpRequestHandler对象将静态资源转发给tomcat的defaultservlet
加上<mvc:default-servlet-handler />后,会导致controller无法处理请求,加上<mvc:annotation-driven >即可保证controller正常使用
静态资源放行二:
springmvc框架内部来处理静态资源(内部通过ResourceHttpRequestHandler对象)
代表所有子路径
mapping是请求路径
location是静态资源的位置
<mvc:resources mapping="/assert/
" location=“/assert/” />
同样加上<mvc:annotation-driven >,保证controller正常使用

7.controller可以通过参数名得到值,从java8开始存储了参数名信息

maven编译是存储在局部变量表中,javac -parameter *.java,也存储了,普通编译就没有

8. Map<String, String[]> parameterMap = request.getParameterMap()

name相同的可以获得数组数据,但是String age1 = request.getParameter(“age”);只能得到单个数据,springmvc可以在controller方法上接收数组数据

9.直接配置请求路径<mvc:view-controller path=“/test/json3” view-name=“/index.jsp”/>

直接配置请求路径path和vie-name,当没有controller处理这个path时才会交给mvc:view-controller处理,同样加上<mvc:annotation-driven >,保证controller正常使用

10.InternalResourceViewResolver和InternalResourceView

默认实现会询问程序的所有ViewResolvers,拿到所有的视图解析器,解析视图,一单返回的view对象不为空,则停止解析,直接返回
,view的render方法渲染,把ModelAndView中的模型数据放到request域中的
受InternalResourceViewResolver影响的有
1.通过返回值ModelAndView设置viewname
2.通过返回值String设置的viewname
3.通过<mvc:view-controller>设置的viewname
可以配置多个InternalResourceViewResolver,order值越小,优先级越高
忽略InternalResourceViewResolver配置的有
1.在viewname前面加上“forward:”或“redirect:”
2.通过ModelAndView的setView方法
之前是根据具体情况创建对应的View对象
InternalResourceView ,JstlView,RedirectView

@GetMapping(value = "/json")
    public ModelAndView testJson(ModelAndView modelAndView){
        modelAndView.setView(new RedirectView("/t/index.jsp",true));//true代表使用contextpath,默认没有
        modelAndView.setView(new InternalResourceView("/t/index.jsp"));//也有true,代表include模式不是forward,输出流开启时间不同
        modelAndView.setView(new JstlView("/t/index.jsp"));//使用JstlView要导入jstljar包
        modelAndView.addObject("age",14);
        return modelAndView;
    }

InternalResourceViewResolver会有欺骗,配置多个也只会有一个起作用

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="order" value="0"/>
    </bean>

11.ResponseStatus

 @GetMapping(value = "/json")
    @ResponseStatus(value = HttpStatus.BAD_REQUEST,reason = "哈哈哈哈哈")
    public ModelAndView testJson(ModelAndView modelAndView){
        modelAndView.setView(new RedirectView("/t/index.jsp",true));
        modelAndView.setView(new InternalResourceView("/index.jsp"));
        //modelAndView.setView(new JstlView("/index.jsp"));
        modelAndView.addObject("age",14);
        return modelAndView;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值