02-SpringMVC使用

一、SpringMVC基于文件配置

1.1、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"
    id="WebApp_ID" version="2.5">
    <!-- 配置 springMVC 编码过滤器 -->
    <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>
        <!-- 启动过滤器 -->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <!-- 过滤所有请求 -->
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- 配置 spring mvc 的核心控制器 -->
	<servlet>
		<servlet-name>SpringMVCDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置初始化参数,用于读取 SpringMVC 的配置文件 -->
        <init-param>
        	<param-name>contextConfigLocation</param-name>
        	<param-value>classpath:SpringMVC.xml</param-value>
        </init-param>
        <!-- 配置 servlet 的对象的创建时间点:应用加载时创建 -->
        <load-on-startup>1</load-on-startup>
	</servlet>
    
	<servlet-mapping>
		<servlet-name>SpringMVCDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

1.2、SpringMVC配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置创建 spring 容器要扫描的包 -->
    <context:component-scan base-package="com.itheima"></context:component-scan>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
     <!-- 在 springmvc 的配置文件中可以配置,静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/scripts/" mapping="/javascript/**"/>
    
    <mvc:annotation-driven>
</beans>

1.3、自定义转换类型

1、实现Coverter接口

public interface Converter<S, T> {//S:表示接受的类型, T:表示目标类型
    @Nullable
    T convert(S source);
}
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        DateFormat format = null;
        try {
            if(StringUtils.isEmpty(source)) {
            	throw new NullPointerException("请输入要转换的日期");
            }
            format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(source);
            return date;
        } catch (Exception e) {
        	throw new RuntimeException("输入日期有误");
        }
    }
}

2、spring 配置文件中配置类型转换器。

<bean id="converterService"
    class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!-- 给工厂注入一个新的类型转换器 -->
    <property name="converters">
        <array>
            <!-- 配置自定义类型转换器 -->
            <bean class="com.itheima.web.converter.StringToDateConverter"></bean>
        </array>
    </property>
</bean>

3、标签中引用配置的类型转换服务

<mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>

1.4、请求参数绑定

​ SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

  • 基本类型参数:包括基本类型和 String 类型

    要求参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写)

  • POJO 类型参数:包括实体类,以及关联的实体类

    要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。

  • 数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)

    • 集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
    • List 集合中的元素赋值, 使用下标。
    • Map 集合中的元素赋值, 使用键值对。
    • 接收的请求参数是 json 格式数据。需要借助一个注解实现。

1.5、响应数据

(1)、void

@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response){
    //1、request跳转页面
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
	
    //2、response 页面重定向
    response.sendRedirect("testRetrunString");
    
    //3、response 指定响应结果
    response.setCharacterEncoding("utf-8");
	response.setContentType("application/json;charset=utf-8");
	response.getWriter().write("json 串");
}

(2)、字符串

​ controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径: /WEB-INF/pages/success.jsp
@RequestMapping("/returnString")
public String testReturnString() {
    System.out.println("AccountController 的 testReturnString 方法执行了。。。。 ");
    return "success";
}  

(3)、ModelAndView

​ ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值 。

@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
    ModelAndView mv = new ModelAndView();
    mv.addObject("username", "张三");
    mv.setViewName("success");
    return mv;
}

1.6、转发与重定向

1、转发

@RequestMapping("/forward")
public String testForward() {
    System.out.println("AccountController 的 testForward 方法执行了。。。。 ");
   
    //路径必须写成实际视图 url,不能写逻辑视图
    //request.getRequestDispatcher("url").forward(request,response)
    return "forward:/WEB-INF/pages/success.jsp"
}

2、重定向

@RequestMapping("/redirect")
public String testRedirect() {
    System.out.println("AccountController 的 testRedirect 方法执行了。。。。 ");
    return "redirect:testReturnModelAndView";//相当于response.sendRedirect(url)
}

1.7、常用注解

(1)、RequestParam

作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value: 请求参数中的名称。
required:请求参数中是否必须提供此参数。 默认值: true。表示必须提供,如果不提供将报错。

@RequestMapping("/user")
public String useRequestParam(@RequestParam("name")String username,
@RequestParam(value="age",required=false)Integer age){
    System.out.println(username+","+age);
    return "success";
}

(2)、RequestBody

作用:
用于获取请求体内容。 直接使用得到是 key=value&key=value...结构的数据。get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false, get 请求得到是 null。

@RequestMapping("/user")
public String useRequestBody(@RequestBody(required=false) String body){
    System.out.println(body);
    return "success";
}

(3)、PathVaribale

作用:
用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。
属性:
value: 用于指定 url 中占位符名称。
required:是否必须提供占位符。

@RequestMapping("/user/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
    System.out.println(id);
    return "success";
}

(4)、ResponseBody

作用:
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如: json,xml 等,通过 Response 响应给客户端

​ Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入jackson 的包。

public class JsonController {
    @RequestMapping("/responseJson")
    public @ResponseBody Account testResponseJson(@RequestBody Account account) {
        System.out.println("异步请求: "+account);
        return account;
    }
}

(5)、RequestHeader

作用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头

@RequestMapping("/user")
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
    System.out.println(requestHeader);
    return "success";
}

(6)、CookieValue

作用:
用于把指定 cookie 名称的值传入控制器方法参数。
属性:
value:指定 cookie 的名称。
required:是否必须有此 cookie。

@RequestMapping("/user")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)
String cookieValue){
    System.out.println(cookieValue);
    return "success";
}

(7)、ModelAttribute

作用:
表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。 key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

@ModelAttribute
public void showModel(User user) {
	System.out.println("执行了 showModel 方法"+user.getUsername());
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
    System.out.println("执行了控制器的方法"+user.getUsername());
    return "success";
}

(8)、SessionAttribute

作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。

@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
    @RequestMapping("/testPut")
    public String testPut(Model model){
        model.addAttribute("username", "泰斯特");
        model.addAttribute("password","123456");
        model.addAttribute("age", 31);
        return "success";
    }
    
    @RequestMapping("/testGet")
    public String testGet(ModelMap model){
      System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
        return "success";
    }
    @RequestMapping("/testClean")
    public String complete(SessionStatus sessionStatus){
        sessionStatus.setComplete();
        return "success";
    }
}

二、SpringMVC无配置文件使用

posted @ 2020-05-25 23:26  ciyelc  阅读(49)  评论(0)    收藏  举报