SpringMVC视图解析器 & 常见功能 & 处理静态资源类型转换器
前言
SpringMVC 要实现省略控制器的部分直接实现从客户端到目标端,要在控制器中写@RequestMapping("XXX") 实现将参数传递并跳转 到 文件视图文件中,现在直接省略控制器中有注释 @RequestMapping("XXX")的方法,直接跳转
SpringMVC 配置相关标签 ,之后直接可以实现将字符串进行切割,插入对象中。
代替 @RequestMapping("XXX")
一、视图解析器
1. 在springMVC的配置文件中直接实现跳转至目标页面
<!-- 配置视图解析器 InternalResourceViewResolver-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 实现将配置的跳转控制和控制器的requestMapping注解共存-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- mvc:view-controller path直接跳转 view-name -->
<mvc:view-controller path="handler/mvcViewController" view-name="sucess"/>
</beans>
在视图解析器下面直接 配置 mvc:view-controller标签。即可实现从一个 页面不经过handler控制器直接跳转到目标页面。path即为@RequestMapping("XXX")
的内容,view-name 即是返回页面,经过视图解析器处理后直接变为目标页面。 该配置会优先于手写的 @RequestMapping("XXX")
,若想实现二者共存,需要增加注解<mvc:annotation-driven></mvc:annotation-driven>。该注解为常用注解,需要熟练掌握。
2. 如果不希望handler控制器中的方法实现 请求转发/重定向 时被springMVC的配置文件影响,需要自行配置目标文件的前后缀,并在返回字符串前添加 forward:/redirect: s ;其中的之前的返回值字符串不再由视图解析器处理,需要手动添加字符串对应的前后缀,实现 请求转发/重定向 。
二、处理静态资源
静态资源只 图片、文字、HTML文件 等不会和用户产生交互的资源,放在项目根目录下也无法直接访问静态资源(报错404,因为请求被web.xml中的springDispatcherServlet已经拦截了一切请求,该类的处理方式就是直接寻找该请求对应的注释 @RequestMapping() )。
只需要在springMVC的配置文件添加一行配置(两个注解,一个之前的mvc:annotation-driven),当一个请求没有对应的 RequestMapping 时,可以使用一些Tomcat中默认的servlet处理,添加配置 mvc:default-servlet-handler 即可。 之后在web.xml 中配置相关的静态资源访问路径的servlet。
1.添加springMVC.xml 的bean配置
代码如下(示例):
<mvc:annotation-driven></mvc:annotation-driven> <!-- mvc:view-controller path直接跳转 view-name --> <mvc:view-controller path="handler/mvcViewController" view-name="sucess"/> <mvc:default-servlet-handler/>
以上的 default-servlet-handler 相当于添加引用了Tomcat自带的web.xml中的servlet配置。在Tomcat的安装目录下进入conf-->web.xml 中,即可发现:<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
在请求中输入相关静态资源的地址即可直接访问静态资源 :http://localhost:8080/SpringMVC_001/picture/point.jpg
2.类型转换器
类型转换器主要作用于三层模型中 表示层的 前台与后台之间。
具体步骤大概分3步 : 1. 引入一个类实现转换器的接口 2.将该类注册到springMVC的配置文件中 3.将转换器的bean再注册到service中 最后将相关的service再注入到 annotation-driven中。 在使用该转换器时,在控制器的方法中的参数前也要添加相关的注解 。
index.jsp 首页代码如下:
<form action= " handler/convert " method="post">
id-name : <input name="convertInfor" type="text" /> <br>
---- "convertInfor" ---
<input type="submit" value=" 转换器">
</form>
将 name="convertInfor" 的信息(1-zs)通过控制器处理(将id-name 格式的字符串写入到person对象中),通过在springMVC.xml 文件中的配置,可实现相关功能。配置信息如下:
<!-- 将 MyConvert 的bean加载到配置文件中-->
<bean id="myconvert" class="priv.mvc.handler.MyConvert"></bean>
<!-- 将转换器的bean加载到 ConversionServiceFactoryBean -->
<bean id="MyConversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myconvert" />
</set>
</property>
</bean>
<!-- 加载ConversionServiceFactoryBean 到 -->
<mvc:annotation-driven conversion-service = "MyConversionServiceFactoryBean">
</mvc:annotation-driven>
控制器中的代码如下 :
@RequestMapping(value="handler/convert") //
public String convertTest( @RequestParam("convertInfor") Person person) {
System.out.println(person.getId()+"-*-"+person.getName());
return "sucess";
}
在新建一个类进行处理字符串生成对应对象:
package priv.mvc.handler;
import org.springframework.core.convert.converter.Converter;
import priv.mvc.entity.Person;
public class MyConvert implements Converter<String,Person> {
@Override
public Person convert(String source) {
// TODO Auto-generated method stub
Person person = new Person() ;
// change String source to array , then add elements to Person
String[] personEle = source.split("-") ; //id-name
person.setId(Integer.parseInt(personEle[0] ) );
person.setName (personEle[1] );
return person;
}
数据格式化 实现 字符串-时间日期 转换
在前端输入 某些特定形式的字符串可以转换为Java中对应的日期格式。形如(2022.05.10)格式的字符串可以直接转换为 Java中 的 Date 对象格式的字符串。
前端显示代码如下(其中下方的birthday 框中用以存储,传递日期格式字段,目前自定义的规则为 yyyy.MM.dd ), 对应Java中的Date对象:
<!-- 数据格式转换 以日期为例 yyyy.MM.dd -->
<form action="handler/formmat" method="post">
id: <input name="id" /> <br>
name : <input name="name" /> <br>
birthday : <input name="birthday" /> <br>
<input type="submit" value="formatConversion">
</form>
在实体类(Person)中,将birthday属性对应的 日期类型做注解处理( 为实现 数据格式化,可以通过 使用注解 @DateTimeFormat(pattern="yyyy.MM.dd") )使其接收到特定的字符串可以转换为Date 对象:
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
public class Person {
private int id ;
private String name ;
private Address address ;
@DateTimeFormat(pattern="yyyy.MM.dd")
private Date birthday ; //birthday
.....
}
在 springMVC.xml 中加载,需要将之前加载的 类型转化器注释掉,使用新的类型转换器bean,该bean对应的类为之前bean对应的类的子类。修改后的xml 内容如下:
<!-- mvc:view-controller path直接跳转 view-name -->
<mvc:view-controller path="handler/mvcViewController" view-name="sucess"/>
<!-- 用以执行加载静态资源 -->
<mvc:default-servlet-handler/>
<!-- 将 MyConvert 的bean加载到配置文件中-->
<bean id="myconvert" class="priv.mvc.handler.MyConvert"></bean>
<!-- 将转换器的bean加载到 ConversionServiceFactoryBean
<bean id="MyConversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myconvert" />
</set>
</property>
</bean>
-->
<!-- 加载ConversionServiceFactoryBean 到 -->
<mvc:annotation-driven conversion-service = "conversionService">
</mvc:annotation-driven>
<!-- 数据格式化测试 日期 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myconvert" />
</set>
</property>
</bean>
控制器代码如下:
@RequestMapping(value="handler/formmat") // 数据格式化
public String testFormmat( Person person) {
System.out.println(person.getId()+"-*-"+person.getName()+"-*-"+person.getBirthday());
return "sucess";
}
运行后结果如下: