springMVC 笔记 请求与响应

SpringMVC开发底层是servlet

依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>

简单应用

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<!--固定配置:配置前端控制器DispatcherServlet
		1.接收客户端请求
		2.让tomcat创建核心容器
	-->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:applicationContext.xml</param-value>
		</init-param>

		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<!-- /代表客户端所有请求都会被dispatcherServlet拦截,然后分发到controller
			但是不包含访问jsp文件
		-->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!--
		配置解决全局乱码的过滤器
	-->
	<filter>
		<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
		<!-- /和/*的区别 /不拦截jsp文件,/*拦截jsp文件-->
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.angen" />

    <!--加载SpringMVC注解驱动-->
    <mvc:annotation-driven />

    <!--配置视图解析器,解析地址-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <!--配置视图解析规则-->
        <!--配置前缀-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

控制器

@Controller
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("sayHello")
    public String hello(){
        //请求转发
        return "success";
    }
}

WEB-INF/pages/success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>请求转发可以跳转的WEB_INF中,并且URL地址不改变</h1>
<h1>是服务器端转发</h1>
</body>
</html>

* RequestMapping注解
* 作用:请求路径映射,具体到哪个方法能处理哪个请求
* 属性:
* 1,path或者value属性:映射路径,该映射路径开头可以不写斜杠
* 2,method属性:指定当前方法只能处理指定请求方式(get,post,delete,put等)
* @RequestMapping(value = "sayHello",method = RequestMethod.GET)
* 这个我们一般都是使用@GetMapping,@PostMapping等来代替了
* 3,params属性:指定限制请求参数的条件
* 4,headers属性:发送的请求中必须包含哪些请求头

* 获取请求参数
* 1,参数名=参数值&参数名=参数值 表单数据类型。参数类型form-data类型:get请求,表单提交
*  1.1以单个参数接收
*  直接以参数名与方法的参数名一一对应即可,springMVC对常用类型有内置转换器
*  1.2以对象方式接收
*      1.2.1 以pojo类对象接收
*          在要请求的方法中添加pojo类型的参数,然后pojo属性类型名称与传过来的参数名一一对应
*          
*      1.2.2 以map 对象接收
*          如果用map类型,只能接收到String类型或者int类型,并且必须在参数前加上@RequestParam注解
*      1.2.3 List接收参数
*           比如多选的时候,以数组类型传递参数 必须在方法参数前加上@RequestParam注解
* 2,{参数值:参数值,参数名:参数值} json数据类型。
*  2.1 POJO类的属性名和请求参数的名要一致
*  2.2 必须在方法请求参数POJO类型前添加@RequestBody注解

自定义类型转换器

用Date做案例,Date默认是转-。我们使用自定义转换器改成/格式转换。

局部转换:可以使用@DateTimeFormat(pattern = "yyyy-MM-dd")注解

public class User implements Serializable {
    private Integer age;
    private String name;
    private String addr;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date date;
}

全局类型转换器

1,编写自定义转换器类型

/*
* 实现Converter接口。接口的泛型
* <String, Date>意思就是把String转换成Date
* */
public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        //source要进行类型转换的数据,
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return simpleDateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException("Date转换器异常");
        }
    }
}

2,配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.angen" />

    <!--加载SpringMVC注解驱动-->
    <mvc:annotation-driven />
    <!--加载SpringMVC注解驱动 conversion-service值和类型转换器的id一致 -->
    <mvc:annotation-driven conversion-service="conversionService"/>

    <!--配置视图解析器,解析地址-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <!--配置视图解析规则-->
        <!--配置前缀-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置类型转换器-->
    <bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!-- 这里可以添加多个类型转换器 -->
                <bean class="com.angen.convert.DateConverter" />
            </set>
        </property>
    </bean>
</beans>

如果我们想使用servlet中的api,那么我们想用谁就给方法传谁

    @RequestMapping("test")
    public void test(HttpSession httpSession, HttpServletResponse httpServletResponse){
        /**
         * 你想用Servlet里面的啥作用域就给参数传什么类
         * */
        //向session对象存值
        httpSession.setAttribute("password","123456");
        //用response
    }

其他SpringMVC常用注解

@RequestParam

1,如果我们要封装参数到Map或者List时必须添加这个注解在参数前面。

2,可以把请求中指定名称的参数赋值给方法的形参。也就是请求参数和方法形参名不一致的时候可以指定。案例:传过来的参数名是name,通过注解把name赋值给username

@RequestMapping(value = "sayHello",method = RequestMethod.GET)
    public String hello(@RequestParam("name")String username){
        //请求转发
        return "success";
    }

@RequestBody

1,获取请求体信息

2,获取json类型的请求参数,封装到pojo类中 

@PathVariable

该注解的作用是获取RestFul风格的url上的参数

同样的url不同的请求方式,对应分发的方法也不同。一个url代表一个资源,通过不同的请求方式对资源进行增删改查方法。

案例

    @GetMapping("/{id}")
    public void findUserById(@PathVariable("id") Integer id){

    }
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id")  Integer id){

    }

@RequestHeader获取指定的请求头

    @GetMapping("test5")
    public void test5(@RequestHeader("user-Agent") String userAgent){

    }

@CookieValue

获取指定cookie的值

@ModelAttribute

防止给不想修改但是没有提交的数据设置为null

@SessionAttributes

注解到类上,实现Session数据共享,作用往Session域对象存数据

在SpringMVC中Model类可以当作参数传给方法,作用往request域对象存数据,,所以我们如果要request域对象数据放到Session域对象里面可以使用这个注解


ModelAndView:既可以绑定域对象,又可以绑定视图

1、返回指定页面

ModelAndView构造方法可以指定返回的页面名称,

也可以通过setViewName()方法请求转发到指定的页面 ,

2、返回所需数值

使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。


请求转发和重定向

    @GetMapping("test6")
    public String  test6(){
        //return "redirct:http://www.baidu.com";
        return "forward:/WEB-INF/pages/success.jsp";
    }


 


 给客户端响应json字符串数据,先添加jackson依赖

<!--Jackson包-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

然后使用@ResponseBody注解,案例:

    @GetMapping("test7")
    @ResponseBody
    public User test7(){
        User user = new User();
        user.setAddr("北京朝阳区");
        user.setAge(18);
        user.setName("张三");
        user.setDate(new Date());
        //将User类型转换成json字符串,并且响应给客户端
        return user;
    }

@ResponseBody注解可以加到类上,可以作用到所有方法。

或者直接写@RestController,这样也可以不写@Controller注解了

posted @ 2022-07-25 20:12  在线电影制作人  阅读(3)  评论(0)    收藏  举报  来源