初始 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 个字符
4.@RequestMapping 属性
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 值
03.@RequestParam()
校正参数, 在客户端请求的参数与 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 注解. 02.@PathVariable 在不指定参数的情况下,
- 默认其参数名, 即路径变量名与用于接收其值的属性名相同. 若路径变量与用于接收其值的属性名不同, 则 @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 和 Windows.onload 区别 01. 单页面书写:$function 多次 Windows.onload
- 一次 02. 执行顺序: $function 先执行 Windows.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.
来源: http://www.bubuko.com/infodetail-2915918.html