springmvc课堂笔记-3
视图解析器
以后开发项目,可以会把视图层直接放在webapp下,那么这些页面再浏览器中就可以直接访问,一旦你可以直接访问了该页面,而该页面的内容需要从后台动态的获取,这种情况下你会发现你访问的页面没有内容或者或出现不同的异常错误,则这种情况会影响整个项目的运行和访问体验,则这情况不可取。
再项目的层次中,webapp下的除了 WEB-INF 的其他的文件夹下的内容都可以直接访问;
再真实的开发中一般会把视图层放在 WEB-INF 中,这样就可以免除视图层直接被访问的问题。
就可以使用springmvc请求进行页面的跳转; 把页面的直接访问转为请求访问。
请求访问代替页面访问
index.jsp
controller
缺点:每一次的页面跳转,都要拼接 WEB-INF ;比较麻烦
解决方案:
使用springmvc的视图解析器
springmvc.xml中配置如下:
controller修改如下:
问题:
如果你的请求处理后需要进入另一个请求中在处理,则会出现问题
解决:
使用字段: forward(请求转发) redirect(响应重定向)
拦截器
springmvc提供的拦截器类似servlet中的过滤器.
1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
使用如下:
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。
这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。
案例: 用户的统一认证
UserInte.java
// 用户的统一认证的拦截器
public class UserInte implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从session中读取user数据,如果有,则释放;如果没有则拦截
Object user = request.getSession().getAttribute("user");
if(user==null ){ // 没有登录
String path = request.getContextPath();
response.sendRedirect(path+"/index");
return false;
}else{ // 登录了,释放
return true;
}
}
}
springmvc.xml
<!-- 配置自定义拦截器的拦截规则 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 定义拦截规则 -->
<mvc:mapping path="/user/**"/>
<!-- 释放不拦截的请求 -->
<!--<mvc:exclude-mapping path=""/>-->
<bean class="cn.hd.inter.UserInte"/>
</mvc:interceptor>
</mvc:interceptors>
异常处理
java已完成的项目中,有可能出现一些例外情况,如果异常没有统一处理,则会再页面中显示异常错误,会影响到整个项目。我们可以采用一些方法来处理这些异常。
1,400—500之间的异常处理
一般再web.xml中配置其异常出现时,跳转的页面即可:
<!-- 404错误 -->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
2,springmvc处理异常的方式
方式一:
SimpleMappingExceptionResolver使用时,只需要在Spring的XML配置文件下就可以了,定义示例如下:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">/error.jsp</prop>
<prop key="java.lang.Throwable">/error.jsp</prop>
</props>
</property>
</bean>
方式二:
实现HandlerExceptionResolver接口自定义异常处理器,定义示例如下:
java类:
public class MyMappingExceptionResolver implements
HandlerExceptionResolver{
public ModelAndView resolverException(HttpServletRequest req,HttpServletResponse res,Object handler,Exception ex){
Map<String,Object> modle=new HashMap<String,Object>();
//根据不同异常类型返回不同视图
return new ModelAndView(“error”,model);
}
}
自定义的异常处理器需要在Spring的XML配置文件中定义下才可应用:
<bean id=“exceptionHandler” class=“com.fuga.interceptor.MyMappingExceptionResolver”/>
方式三:
@ExceptionHandler注解实现异常处理,使用方法如下,首先编写一个BaseController类,定义如下:
baseController类:
public class BaseController{
@ExceptionHandler
public String execute(HttpServletRequest request,Exception ex){
request.setAttribute(“ex”,ex);
//可根据异常类型不同返回不同视图名
return “error”
}
}
适合局部处理有“处理过程”的异常
然后其他的Controller继承BaseController类即可