springmvc课堂笔记-3

本文详细介绍了SpringMVC中的视图解析器,如何避免每次页面跳转手动拼接WEB-INF路径,以及解决请求转发和重定向的问题。接着讨论了拦截器的概念,与过滤器的区别,并给出了使用示例,特别是在用户统一认证中的应用。最后,文章探讨了SpringMVC中异常处理的三种方法,包括通过SimpleMappingExceptionResolver、自定义HandlerExceptionResolver和使用@ExceptionHandler注解的局部异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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类即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值