SpringMVC视图解析器常见功能、类型转换、格式化

InternalResourceViewResolver其他功能:
1. <mvc:view-controller ...>
index.jsp -> Controller(@RequsetMapping("handler/welcome")) ->succes.jsp


要用SpringMVC实现:index.jsp -> succes.jsp  :

在springMVC.xml 配置文件中加上:

<!--view-name也会被视图解析器加上前缀和后缀-->
<mvc:view-controller path="handler/welcome"   view-name="success" />

以上注解 ,会让所有的请求 转入<mvc:..>中匹配映射地址,而会忽略 @RequsetMapping()
如果想让 @RequsetMapping("handler/welcome")  和 <mvc:..> 共存,则需要加入一个注解:

<!--此配置是SpringMVC的基础配置,很功能都需要通过该注解来协调  -->
<mvc:annotation-driven></mvc:annotation-driven>

2.指定请求方式

(在handler.java中)

指定跳转方式:不改变地址栏

return "forward:/views/success.jsp";  

forward:   redirect: ,需要注意 此种方式,不会被视图解析器加上前缀(/views)、后缀(.jsp)

重定向:(地址栏改变)

return "redirect:/views/success.jsp"; 

3.处理静态资源:html css js  图片 视频

可以与用户交互、因为时间/地点的不同 而结果不同的内容:动态(百度:天气  )


在SpringMVC中,如果直接访问静态资源:404 。

原因:之前将所有的请求 通过通配符  “/ ”  拦截,进而交给 SPringMVC的入口DispatcherServlet去处理:找该请求映射对应的 @requestMapping

http://localhost:8888/SpringMVCProject/img.png

@RequsetMapping("img.png")
return sucess


解决:如果是 需要mvc处理的,则交给@RequsetMapping("img.png")处理;如果不需要springmvc处理,则使用 tomcat默认的Servlet去处理。
tomcat默认的Servlet去处理:如果有 对应的请求拦截,则交给相应的Servlet去处理;如果没有对应的servlet,则直接访问。
tomcat默认的Servlet在哪里? 在tomcat配置文件\conf\web.xml中  

 <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>xxx.xxx.xx.ABCServlet</servlet-class>
  </servlet>
    
  <servlet-mapping>
        <servlet-name>abc</servlet-name>
        <url-pattern>/abc</url-pattern>
  </servlet-mapping>


  

解决静态资源方案:如果有springmvc对应的@requestMapping则交给spring处理;如果没有对应@requestMapping,则交给服务器tomcat默认的servlet去处理  :实现方法,在springmvc.xml配置文件中 只需要

<!-- 该注解 会让 springmvc: 接收一个请求,并且该请求 
没有对应的@requestmapping时,
将该请求 交给服务器默认的servlet去处理(直接访问)  -->	
<mvc:default-servlet-handler></mvc:default-servlet-handler>

<!--访问动态-->
<mvc:annotation-driven></mvc:annotation-driven>


总结:要让springmvc访问静态资源,只需要加入以下2个注解

<mvc:default-servlet-handler></mvc:default-servlet-handler>
<mvc:annotation-driven></mvc:annotation-driven>


4.类型转换

a. Spring自带一些 常见的类型转换器:

public String  testDelete(@PathVariable("id") String id) ,
//即可以接受int类型数据id  也可以接受String类型的id


b. 可以自定义类型转换器
i.编写 自定义类型转器的类 (实现Converter接口)

public class MyConverter  implements Converter<String,Student>{

    @Override
    public Student convert(String source) {//source:2-zs-23
        //source接受前端传来的String:2-zs-23
        String[] studentStrArr = source.split("-") ;
        Student student = new Student();
        student.setId(  Integer.parseInt(  studentStrArr[0]) );
        student.setName(studentStrArr[1]);
        student.setAge(Integer.parseInt(studentStrArr[2] ));
        return student;
    }

}


ii.配置:将MyConverter加入到springmvc中

<!-- 1将 自定义转换器 纳入SpringIOC容器 -->
    <bean  id="myConverter" class="org.lanqiao.converter.MyConverter"></bean>
    
    <!-- 2将myConverter再纳入 SpringMVC提供的转换器Bean -->
    <bean id="conversionService"  class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="myConverter"/>
            </set>
        </property>
    </bean>
  <!-- 3将conversionService注册到annotation-driven中 -->
    <!--此配置是SpringMVC的基础配置,很功能都需要通过该注解来协调  -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>


    测试转换器:       

 @RequestMapping(value="testConverter")
 public String testConverter(@RequestParam("studentInfo")  Student student) {
// 前端:2-zs-23              
                    
  System.out.println(student.getId()+","+student.getName()+","+student.getAge());
            
  return "success";
  }

  其中@RequestParam("studentInfo")是触发转换器的桥梁:
@RequestParam("studentInfo")接受的数据 是前端传递过来的:2-zs-23  ,但是 需要将该数据 复制给 修饰的目的对象Student;因此SPringMVC可以发现 接收的数据 和目标数据不一致,并且 这两种数据分别是 String、Student,正好符合public Student convert(String source)转换器。


5.数据格式化
  

 SimpleDateForamt sdf = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");


SPringMVC提供了很多注解,方便我们数据格式化
实现步骤:
a.配置 (在springmvc.xml)  

 <!-- 配置 数据格式化 注解 所依赖的bean -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    </bean>


b.通过注解使用

@DateTimeFormat(pattern="yyyy-MM-dd")
@NumberFormat(parttern="###,#")  

在Student 类中加注解 

public class Student {
	@NumberFormat(pattern="###,#") 
	private int id;
	
	private String name;
	private int age;
	
	@DateTimeFormat(pattern="yyyy-MM-dd")//格式化:前台传递来的数据,将前台传递来到数据 固定为yyyy-MM-dd
	private Date birthday ;//  2020-12-13

 BingResult 处理异常(handler.java)

@RequestMapping(value="testDateTimeFormat")//如果Student格式化出错,会将错误信息 传入result中
		public String testDateTimeFormat(Student student , BindingResult result) {
			
			System.out.println(student.getId()+","+student.getName()+","+student.getBirthday());
			
			if(result.getErrorCount() >0) {
				for(FieldError error:  result.getFieldErrors() ) {
					System.out.println(error.getDefaultMessage());
				}
			}
			return "success";
		}

猜你喜欢

转载自blog.csdn.net/weixin_40569991/article/details/87651045
今日推荐