初始SpringMVC 完整版

初始SpringMVC
1.SpringMVC
也叫Spring Web mvc,属于表现层的框架。Spring MVC是Spring框架的一部分,是在Spring3.0后发布的。

2.Java EE的13种核心技术如下:
01、JDBC。
02、JNDI。
03、EJB。
04、RMI。 √ √ √ √ √
05、JSP。
06、Java Servlet。
07、XML。
08、JMS。 √ √ √ √ √
09、Java IDL。
010、JTS。
011、JTA。
012、JavaMail。 √ √ √ √ √

3.配置步骤
01.在web.xml中配置前端控制器
02.处理器映射器(HandlerMapping)
03.处理器适配器(HandlerAdaptor)
04.处理器
05.视图解析器(ViewResolver)
*01/04是必须配置的,其他应用程序有默认配置
4.关于请求方式
Post 添加
get 查询单个对象
Put 修改
Delete 删除
5.配置
01.web.xml文件中配置
<!--Spring MVC 中央调度器就是一个Servlet节点 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--Spring配置文件的路径-->
<param-name>contextConfigLocation</param-name>
<!--配置文件-->
<param-value>classpath:Spring配置文件</param-value>
</init-param>
<!--web启动时加载Servlet时机-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
01.1
load-on-startup
值为负数或者没有设置,则容器会当Servlet被请求时再加载。如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
01.2小结
servlet节点中配置了<init-param>子节点。可以保障应用程序中单个Servlet对象
02.处理器(普通)
02.1
实现接口Controller
02.2
方法中实现ModelAndView对象,并返回。
6.Springmvc执行流程
01.客户端 request----------------》中央调度器 (本质就是一个Servlet DispatcherServlet)

02.HandlerMapping 处理器 映射器 --------》寻址Hanlder ,但是不具备Handler执行权 ,返回处理器执行链(HandlerChain)

03.将返回的处理器执行链转交给 中央调度器

04.中央调度器 ------------> HandlerAdaptor( 处理器适配器 ) -------具备调度的Handler的权限

05.执行Hanlder ,Handler返回的结果类型ModelAndView(视图和模型),并将结果交给 中央调度器

06.中央调度器 寻址视图解析器(//////////// .jsp .ftl .xxx)

07.使用物理视图渲染页面 ,html标签 浏览器只能认识html标签 Data+View
7.Spring MVC 核心组件
01.中央调度器(DispatcherServlet)
02.视图解析器(ViewResolver)
03.处理器映射器(HandlerMapping)
04.处理器(Handler)
05.处理器适配器(HandlerAdaptor)
06.视图(View)
8.视图解析器
01.语法
<!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
02.小结
02.1
InternalResourceViewResolver一个非常重要的特性,我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。

02.2
处理器中一个InternalResourceViewResolver的定义,根据该定义当返回的逻辑视图名称是test的时候,InternalResourceViewResolver会给它加定上义好的前缀和后缀,组成“/WEB-INF/test.jsp”的形式,然后把它当做一个InternalResourceView的url新建一个InternalResourceView对象返回。
9.解决静态资源无法访问
拦截器:控制器/静态资源
01.Spring默认解决方式
一切源于Restful编程rest
01.2.web.xml文件中
语法
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>不需要拦截的内容</url-pattern>
</servlet-mapping>

02.使用MVC的default-servlet-handler
02.1
会将对静态资源的访问请求通过HandlerMapping映射到默认Servlet请求处处理DefaultServletRequestHandler对象。而该处理器调度了Tomcat的DefaultServlet来处理静态资源的访问请求

02.2ApplicationContext文件中
语法
<mvc:default-servlet-handler></mvc:default-servlet-handler>
*当然需要引入mvc约束
03.使用MVC的resource节点解决
03.1
在Spring3.0.4之后,Spring定义了专门用于处理静态资源请求的处理器ResourceHTTPRequestHandler。并且添加了<mvc:resources/>标签,专门用于解决静态资源无法访问问题
03.2
语法
<mvc:resources location="/image/" mapping="/image/**" ></mvc:resources>
location:静态资源所在目录
mapping:对资源的请求
*需要Tomcat7支持
10.处理器映射器
01.Map方式配置(方式1)
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="访问名称">
<value>处理器配置文件</value>
</entry>
</map>
</property>
</bean>
02.Properties方式配置(方式2)
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="访问名称">处理器配置文件</prop>
</props>
</property>
</bean>
03.防止客户端直接访问,只能通过别名访问
11.AbstractController(限定请求方式)
01.说明
若处理器继承自AbstractController类,那么该控制器就具有了一些功能。因为AbstractController类还继承自一个父类WebContentGenerator,WebContentGenerator具有supportMethods属性,可以设置支持HTTP数据提交方式。默认支持GET/POST/HEAD
02.配置方式
02.1
继承AbstractController
02.2
方法中实现ModelAndView对象,并返回。
02.3
在ApplicationContext配置文件bean节点中,通过设置supportedMethods属性限定请求方式
12.方法名解析器,多动作解析器(默认)
MultiActionController
01.说明
客户端通过处理器类中方法名,访问响应的方法
02.配置
02.1
处理器映射器的配置
访问修改为“/*”(因为访问多个页面)
02.2
处理器
01.继承MultiActionController
02.自定义响应的方法
如:
public String doshow1(HttpServletRequest request, HttpServletResponse response) throws Exception {
return "index";
}
03.操作
url访问处理器类中的方法名,获取到方法的返回,通过视图解析器展示
13.属性方法名称解析器
PropertiesMethodNameResolver
01.说明
可以通过客户端访问的属性名称,访问到对应方法。可以避免直接引用
02.步骤
02.1
bean指定PropertiesMethodNameResolver,properties属性指向mappings,mapping中指定
语法
<!--方法名称解析器-->
<bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/index">doshow1</prop>
<prop key="/index1">doshow2</prop>
<prop key="客户端访问地址">处理器类方法</prop>
</props>
</property>
</bean>
02.2
处理器节点中通过methodNameResolver属性,引入方法名称解析器。
语法
<bean id="xxx" class="mvc.Day02_PropertiesMethodNameResolver.Day02PropertiesMethodNameResolver">
<property name="methodNameResolver" ref="propertiesMethodNameResolver"></property>
</bean>
*绑定方法名称解析器
*处理器映射器的配置
访问修改为“/*”(因为需要访问多个)
14.参数方法名称解析器
ParameterMethodNameResolver
01.说明
客户端通过参数访问响应的处理器方法
02.步骤
02.1
bean节点指定ParameterMethodNameResolver,properties属性指向paramName。可以理解为固定参数名称,用于就收参数
语法
<bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action"></property>
</bean>
02.2
处理器节点中通过methodNameResolver属性,引入参数方法名称解析器。
语法
<bean id="xxx" class="mvc.Day02_PropertiesMethodNameResolver.Day02PropertiesMethodNameResolver">
<property name="methodNameResolver" ref="parameterMethodNameResolver"></property>
</bean>
03.小结
03.1
处理器映射器,拦截地址修改为固定名称
03.2
客户端访问时,URL
语法
http://localhost:8080/处理器映射器名?定义的接收参数变量=处理器类中方法名
15.HTTP请求方式
01.
GET
请求指定的页面信息,并返回实体主体。
02.
POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
03.
PUT
从客户端向服务器传送的数据取代指定的文档的内容。
04.
DELETE
请求服务器删除指定的页面。
05.
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
06.
OPTIONS
允许客户端查看服务器的性能。
07.
TRACE
回显服务器收到的请求,主要用于测试或诊断。
08.
HEAD
类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
16.视图解析器
BeanNameViewResolver
01.视图对象
定义外部资源视图对象
RedirectView
定义内部资源视图对象
JstlView
02.语法
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"></bean>
<!--外部视图解析器-->
<bean id="redirectView" class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="https://sale.jd.com"></property>
</bean>
<!--内部视图解析器-->
<bean id="jstlView" class="org.springframework.web.servlet.view.JstlView">
<property name="url" value="/index2.jsp"></property>
</bean>
*在处理器中使用解析器的id,定义响应的方法
03.1
外部视图解析器/内部视图解析器区别
01.外部视图解析器
可以访问外网
02.内部视图解析器
只能访问工程内部
17.分离配置信息
XmlViewResolver
01.说明
在使用BeanNameViewResolver(视图解析器)时可以创建多个外部/内部视图解析器,为了避免代码的零散,提取到单独的Spring容器进行管理。
02.语法
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location" value="classpath:单独提取的视图解析器"></property>
</bean>
*视图解析器根节点(BeanNameViewResolver),可以在提取的Spring容器,也可以在原Spring容器。

--------------------------------------配置式开发结束,注解式开发开始-------------------------------------------

1.注解
01.1概念
一种可以在类、方法、参数上进行标注的一种技术,被标注的对象可以受到JVM的特殊礼遇多一些特殊的信息
01.2常用注解
01.在ApplicationContext文件中导入命名空间
01.1
xmlns:context="http://www.springframework.org/schema/context"
01.2在xsi:schemaLocation下添加
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
01.3 注意
也可以使用快捷方式进行导入Alt+Enter
01.4 在beans节点中添加(添加扫描器)
<context:component-scan base-package="扫描注解配合路径"></context:component-scan>
*base-package指定的是使用注解的类包名
02.在实体类中
02.1
类上方
@Component 不按照上面三个注解分类,就用此注解
@Repository 持久层
@Service 业务逻辑层
@Controller 控制器
如:@Component("use")
use表示bean节点的id
*如注解中没有定义值,默认是类的小写
属性注入值
@Value("")
03.域属性注入值
03.1
使用jdk提供的注解
@Resource(name = "")
name指定的是bean节点的id
03.2
使用spring提供的注解
@Autowired //表示自动连接
@Qualifier(value = "")
value指定的是bean节点的id
03.3小结
01.
@Resource默认安装byName的方式进行装配。byName的含义:拥有该属性字段名称必须和Spring容器中现有bean的id相同。@Resource比较只能,当根据byName方法装配失败后,它会继续尝试使用byType的方式进行装配,即使类型相同也可以完成装配。
02.
@Autowired默认安装byType的方式进行装配,拥有该注解的字段类型必须和Spring容器中现有类型相同。如果发现与字段想用的bean会导致异常。
03.
@Qualifier将此注解跟@Autowired混合使用时,含义是强制使用byName的方式进行装配,不匹配直接导致异常
2.配置案例
01.Spring容器中配置视图解析器/包扫描器
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--包扫描器-->
<context:component-scan base-package="直接配置类包级路径"></context:component-scan>
02.类的配置
@Controller //标记,成为Spring容器管理的的对象
@RequestMapping("/Logger")//映射请求参数,请求方法或请求头
public class Day04AnnotationDevelopment01 {
@RequestMapping("/show1")
public String doshow1(HttpServletRequest request, HttpServletResponse response){
return "index1";
}
@RequestMapping("/show2")
public String doshow2(HttpServletRequest request, HttpServletResponse response){
return "index2";
}
}
3.通配符
*XXX 以XXX结尾

XXX* 以XXX开头

/**/XXX XXX之前可以有0到N级目录

/*/XXX XXX之必须有一级目录

XXX*X XXX~X之间可以包含0到N个字符
[email protected]属性
01.
有一个属性method,用于对被注解方法所处理请求的提交方式进行限制,只有满足该method属性指定的提交方式,才会执行被注解方法。
method属性的取值为RequestMethod,是一个枚举常量。常用值为
RequestMethod.GET 或 RequestMethod.POST.
02.案例
@RequestMapping(value="请求Url地址",method=RequestMethod.POST或GET)
*如果在两个方法上都添加了一样的value,不一样的请求方式的RequestMapping。Spring容器会通过响应的请求方式访问方法
5.处理器方法参数
处理器方法中常用的参数有五类,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用
01.HttpServletRequest
02.HttpServletResponse
03.HttpSession
04.用于承载数据的Model
05.请求中携带的请求参数
6.零散参数自动装配
01.客户端请求Controller
只要参数一致,就可以达到参数的自动装配
02.Controller携带参数到客户端
@RequestMapping("/show1")
public String doshow1(HttpServletRequest request, HttpServletResponse response, Model model){
model.addAttribute("key值","value值");
return "index1";
}
*在Controller层直接通过Model对象传入参数
*客户端通过EL表达式获取(${key值})。通过key获取Model对象中的value值
[email protected]()
校正参数,在客户端请求的参数与Controller层不一致时使用
通过Controller方法入参前@RequestParam("别名"),校正参数
7.对象参数装配
01.客户端请求Controller
页面中name的参数与实体类对象名称一致即可
02.Controller携带参数到客户端
@RequestMapping("/show1")
public String doshow1(Book book, Model model){
model.addAttribute("key值","value值");
System.out.println(book.getName())
return "index1";
}
*在Controller层直接通过Model对象传入参数
*客户端通过EL表达式获取(${key值})。通过key获取Model对象中的value值
8.域属性装配
01.客户端请求Controller
页面中name的参数(域属性名.实体类常量)与实体类对象名称一致即可
02.Controller携带参数到客户端
@RequestMapping("/show1")
public String doshow1(Book book, Model model){
model.addAttribute("key值","value值");
System.out.println(book.type.getName())
return "index1";
}
*在Controller层直接通过Model对象传入参数
*客户端通过EL表达式获取(${key值})。通过key获取Model对象中的value值
8.集合属性装配
01.客户端请求Controller
页面中name的参数(属性名[index].实体类常量)与实体类对象名称一致即可
02.Controller携带参数到客户端
@RequestMapping("/show1")
public String doshow1(Book book, Model model){
model.addAttribute("key值","value值");
System.out.println(book.type[0].getName())
return "index1";
}
*在Controller层直接通过Model对象传入参数
*客户端通过EL表达式获取(${key值})。通过key获取Model对象中的value值
9.编码过滤器
<!--编码过滤器-->
<filter>
<filter-name>encodeFilter</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>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
10.路径变量
@PathVariable
01.对于处理器方法中所接收的请求参数,可以来自于请求中所携带的参数,也可以来自于请求的URI中所携带的变量,即路径变量。不过,此时,需要借助@PathVariable注解。
[email protected]在不指定参数的情况下,默认其参数名,即路径变量名与用于接收其值的属性名相同。若路径变量与用于接收其值的属性名不同,则@PathVariable可通过参数指出路径变量名称。
03.使用
在方法入参前使用注解
11.处理器方法的返回值
01.ModelAndView
若处理器方法处理完后,需要跳转到其它资源,而又要在跳转的资源间传递数据,此时选择ModelAndView作为处理器方法的返回值
02.String 内部资源视图名
02.1
通过ApplicationContext中配置的视图解析器

03.void(不常用)
通过ServletAPI完成数据和视图功能
03.1转发(Spring容器默认)
03.2重定向
04.void Ajax
使用fastjson
04.1步骤
01.依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
02.在Controller层把数据转换为json格式,后发送给客户端
String data = JSON.toJSONString(数据);//把普通数据转换为JSON格式
response.getWriter().write(data);//放入响应对象
03.客户端使用ajax操作
05.Object json
01.客户端访问Controller层方法时直接返回json数据
02.配置
02.1 依赖
<!--jackson为了生成json对象-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>
02.2 ApplicationContext文件
<mvc:annotation-driven></mvc:annotation-driven>
02.3 直接Controller配置使用
@ResponseBody
06.Object 字符串型
01.解决上方服务器响应json对象中,中文乱码
02.配置
@RequestMapping(value = "/doshow",produces = "text/html;charset=utf-8")
*使用RequestMapping中produces属性
07.Object 自定义对象类型
01.客户端请求服务器时返回对象类型(json对象)
02.返回结果(格式)
02.1返回单个对象
{"对象属性":"对象属性值","对象属性":对象属性值}
*直接大括号包裹对象
02.2返回集合对象
[{"对象属性":"对象属性值","对象属性":对象属性值},{"对象属性":"对象属性值","对象属性":对象属性值}]
*中括号包裹
03.对象属性值
引用类型值会被双引号包裹,值类型直接
08.Object Map
01.服务器返回结果(json格式)
{"map集合key":Map集合Value,"map集合key":Map集合Value}
如:
{"友情岁月":{"username":"友情岁月","password":"123456"},"明天会更好":{"username":"明天会更好","password":"密码2"}}
12.$function和window.onload区别
01.单页面书写:$function多次 window.onload一次
02.执行顺序: $function先执行 window.onload后执行
13.转发和重定向
当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器。

01.重定向为
redirect
*默认不会通过视图解析器,直接当做服务器内部对象查找(物理视图)
02.转发为(默认)
forward
03.案例
/*
* 转发
* */
@RequestMapping("doshow5")
public String doRequest(){
return "forward:doshow";
}
/*
* 重定向
* */
@RequestMapping("doshow6")
public String doResponse(){
return "redirect:doshow";
}

14.异常处理
01.系统异常处理
SimpleMappingExceptionResolver
01.1.配置
直接在ApplicationContext配置文件中添加SimpleMappingExceptionResolver节点
01.2.示例
<!--系统处理异常-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--出现异常后跳转的位置(默认错误视图)-->
<property name="defaultErrorView" value="/Second.jsp"></property>
<!--捕捉异常信息-->
<property name="exceptionAttribute" value="ex"></property>
</bean>
01.3.缺点
404错误,无法处理
02.高级系统异常处理器
02.1示例
<!--系统处理异常-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--出现异常后跳转的位置(默认错误视图)-->
<property name="defaultErrorView" value="/Second.jsp"></property>
<!--捕捉异常信息-->
<property name="exceptionAttribute" value="ex"></property>
<!--定义需要特殊处理的异常,用类名或完全路径名作为key,异常页文件名作为值(错误页面),
    将不同的异常映射到不同的页面上-->
<property name="exceptionMappings">
<props>
<prop key=""></prop>
</props>
</property>
</bean>
02.2配置
使用属性exceptionMappings,手动指定异常类型
02.3缺点
404错误,无法处理
03.自定义异常处理器
03.1概念
使用Springmvc定义好的SimpleMappingExceptionResolver异常处理器,可以实现发生指定异常后的跳转。但是若要实现在捕获到指定异常时,执行一些操作的目的,它是完成不了的。此时,就需要自定义异常处理器。自定义异常处理器,需要实现HandlerExceptionResolver接口,并且该类需要在Springmvc配置文件中进行注册
03.2配置
01.Controller层照常写
02.自定义异常处理器实现接口(HandlerExceptionResolver),并实现方法
03.ApplicationContext文件中引入自定义异常处理器,关联
04.页面使用EL表达式,读取ModeAndView中异常信息
03.3配置(示例)
Controller层
@RequestMapping("/doshow1")
public String doCustomExceptions(String name,Integer age) throws Exception {
if (!name.equals("admin"))
throw new UNameException("用户名错误");//自定义异常类中放入信息
else if (age>50)
throw new UAgeException("年龄不合法");
return "index";
}
自定义异常处理器
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("e",e);//异常信息放入ModelAndView对象
if (e instanceof UNameException){//判断异常类型
modelAndView.setViewName("Second");//错误视图---》出现错误时跳转的页面
}
}else if(e instanceof UAgeException){
modelAndView.setViewName("Second");
}
return modelAndView;
}
ApplicationContext
<!--指定已定义异常类 class指定自定义异常类-->
<bean class="cn.happy.day08CustomExceptions.CustomExceptions"></bean>
04.异常处理注解
01.概念:
使用注解@ExceptionHandler可以将一个方法指定为异常处理方法。该注解只有一个可选属性value,为一个Class<?>数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。
02.配置
02.1直接在Controller层完成
01.Controller层

@RequestMapping("/doshow1")
public String doCustomExceptions(String name,Integer age) throws Exception {
if (!name.equals("admin"))
throw new UNameException("用户名错误");//自定义异常类中放入信息
else if (age>50)
throw new UAgeException("年龄不合法");
return "index";
}
02.异常处理器(直接提取成方法)
@ExceptionHandler({UAgeException.class,UNameException.class})//引入异常类型
public ModelAndView resolveException(Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("e",e);//异常信息放入ModelAndView对象
if (e instanceof UNameException){//判断异常类型
modelAndView.setViewName("Second");//错误视图---》出现错误时跳转的页面
}else if(e instanceof UAgeException){
modelAndView.setViewName("Second");
}
return modelAndView;
}

15.EL表达式
${ex.message}
底层编译时会在调度的message前加get,message编译为Message,后加()
*因为EL表达式底层调度的就是Get方法
16.索引器/属性
属性的本质是方法
索引器的本质是属性

17.类型转换器
01.概念
为什么页面上输入”12”,可以赋值给Handler方法对应的参数?
这是因为框架内部帮我们做了类型转换的工作。将String转换成int但默认类型转换器并不是可以将用户提交的String,转换为用户需要的所有类型。此时 ,就需要自定义类型转换器了
02.配置
02.1自定义格式转换类
实现接口Converter,并实现方法
02.2ApplicationContext
01.注册类型转换器
bean节点引入自定义转换器类
*命名空间:javax.faces.convert.Converter
02.注册转换服务器对象
ConversionServiceFactoryBean节点,属性converters指定注册类型转换器id
03.注册mvc注解驱动
<mvc:annotation-driven conversion-service="注册转换器id">
18.注解类型转换1
01.概念
经常会遇到页面某些数据类型是Date、Integer、Double等的数据要绑定到控制器的实体,或者控制器需要接受这些数据,如果这类数据类型不做处理的话将无法绑定。这时我们就可以在Controller层使用注解@InitBinder进行类型装配
02.配置
/*
* 下面date类型的转换
* */
@InitBinder("date")
public void initBinder(WebDataBinder binder){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//参数一:需要转换的类型,,,,,,参数二:系统属性类型编辑器
binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));
}
/*
*页面请求方法
*/
@RequestMapping("/doShow")
public String doshow(String name, int age, Date date){
System.out.println(name);
System.out.println(age);
System.out.println(date);
return "/Second.jsp";
03.注解使用
直接定义注解时,会通过请求方法的入参挨个走一遍。如果在注解中指定了转换的入参,那么转换器只针对指定的参数
}
-------------------------------------------------课外内容------------------------------------------------------

1.

原文地址:https://www.cnblogs.com/SFHa/p/10253657.html

时间: 2024-11-09 03:00:51

初始SpringMVC 完整版的相关文章

rip路由协议 细节分析及实例配置【完整版】

rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现自己不足的问题,也希望能够找到一些比较冷僻的问题,这样子才会有意思多了.   先上图,这个就是我准备做实验的基本用图了.现在已经按照图上标注的IP将所有基本配置设置好了. 在这个实验中,大多数都是基于ripv1,只有在需要比较的时候才会把版本改成ripv2,然后判断完之后再切换为ripv1: 第一步

计算机组成原理_第四版课后习题答案(完整版)

计算机组成原理_第四版课后习题答案(完整版) ?第一章 1.?比较数字计算机和模拟计算机的特点. 解:模拟计算机的特点:数值由连续量来表示,运算过程是连续的: 数字计算机的特点:数值由数字量(离散量)来表示,运算按位进行. 两者主要区别见P1?表1.1. 2.?数字计算机如何分类?分类的依据是什么? 解:分类: 数字计算机分为专用计算机和通用计算机.通用计算机又分为巨型机.大型机. 中型机.小型机.微型机和单片机六类. 分类依据:专用和通用是根据计算机的效率.速度.价格.运行的经济性和适应性来划

谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版

谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版 一.讲座正文: 大家好!我是贾扬清237,目前在Google Brain83,今天有幸受雷鸣师兄邀请来和大家聊聊Caffe60.没有太多准备,所以讲的不好的地方还请大家谅解. 我用的ppt808基本上和我们在CVPR上要做的tutorial是类似的,所以大家如果需要更多的内容的话,可以去tutorial.caffe.berkeleyvision.org,也欢迎来参加我们的tutorial:) 网页上应该还有一些python的样例帮助大家上

常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》

常用经典SQL语句大全完整版--详解+实例 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop data

Struts1和Struts2的区别和对比(完整版)(转)

Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去 实现 常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Act

网站推广优化教程100条(完整版)

网站推广优化教程100条(完整版)下面介绍新手建站推广完美教程,各位根据自己的实际情况酌情选用: 1.准备个好域名.①.尽量在5位数内,当然也不一定,反正要让用户好记.(看个人):②.尽量用顶级的域名,搜索排名感觉好一点.③.做中文站最好用拼音注册,不要问为什么.看百度(baidu.com)就是很好证明.④.域名的安全性,最好选择有些权威的注册商.⑤.好域名或者说主域名最好注册3年以上,因为百度在扒正规站的毛的时候,会看这些资料,他会觉得你不会很快转行的…… 2.网站空间很重要①.速度打开速度慢

学习响应式设计(Learning Responsive Web Design)完整版PDF

想要为平板.手机.笔记本.大屏幕设备,甚至可穿戴设备提供最优的用户体验?那就学习响应式设计吧.这是一本内容特别全面.讲解非常透彻的入门书.特别地,通过这本书不仅能迅速掌握响应式Web设计的基本原理,还能够从头到尾了解响应式设计的工作流程:从项目启动开始,到项目最终上线为止. 只要你的工作与创建.改造或者升级网站有关系,都应该看看这本书.换句话说,不仅是前端开发人员,设计师.产品经理.项目经理,甚至后端开发人员也可以通过本书掌握响应式设计的精髓所在.这本书基于响应式设计的前沿技术和社区经验写成,汇

office2016 软件全集 官方下载免费完整版(含破解文件)不含垃圾软件 win10完美激活

office2016官方下载免费完整版是新一代办公软件,office2016官方下载免费完整版已经分享到下面,office2016官方下载免费完整版包括了Word.Excel.PowerPoint.OneNote.Outlook.Skype.Project.Visio以及Publisher等组件和服务.下面分享:office2016软件的下载.安装及激活. 本文来自互联网,按原教程安装结果中招了,因含有垃圾软件,所以决定改写,以免你懂的... 注册文件下载中含有垃圾软件,请按下面的步骤操作会跳过

Hadoop实战视频教程完整版 完整的Hadoop大数据视频教程

分享一套迪伦老师的完整的Hadoop实战视频教程,教程从学习Hadoop需要的数据库.Java和Linux基础讲起,非常适合零基础的学员,课程最后结合了实战项目演练,理论结合实战,深入浅出,绝对是当前最为完整.实战的Hadoop教程. <Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标)> 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:230课时 用到技术:部署Hadoop集群 涉及项目:京东商城.百度.阿里巴巴 咨询QQ:1337192913(小公子)