@RequestMapping(value="/login",method=RequestMethod.GET) public String login(){ return "login"; } @RequestMapping(value="/login",method=RequestMethod.POST) public String login(String username, String password, HttpSession session){ if(!users.containsKey(username)){ throw new UserException("用户名不存在"); } User u=users.get(username); if(!u.getPassword().equals(password)){ throw new UserException("用户密码不正确"); } session.setAttribute(username, u); return "redirect:/user/users"; }
这里主要讲异常处理。
首先讲 局部异常处理。
1. 在UserController下加入以下方法:
//局部异常处理,只能处理这个控制器中的异常. @ExceptionHandler(value={UserException.class}) public String handlerException(UserException ue,HttpServletRequest req){ req.setAttribute("exception", ue); return "error"; }
2.在WEB-INF/jsp下创建error.jsp文件
<body> <h1>${exception.message}</h1> </body>
此时用户访问所产生的内部异常将不会抛出我们平时所见的exception stack,而是返回给用户error.jsp页面,并告知用户异常信息。
error.jsp这个页面我们就可以让美工自由发挥了。 -O-
接下来是 全局异常处理
在hello-servlet.xml中加入:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!--这里必须要写SimpleMappingExceptionResolver里的元素名称:private Properties exceptionMappings; --> <property name="exceptionMappings"> <props> <!-- 要映射的异常类 --> <prop key="com.lj.model.UserException">error</prop> </props> </property> </bean>
加入全局异常以后,任何控制器里抛出的UserException都会被SpringMVC捕获并将页面跳转到WEB-INF/jsp/error.jsp页面。
对应的异常对象是exception.
静态文件
由于SpringMVC通过设置web.xml的servlet,捕获了所有路径。
<servlet> <servlet-name>hello</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
这样一来,客户端就不能访问到css,jpg等文件。
因此必须采取相应的配置才能让用户访问这些文件。
在hello-servlet.xml中加入:
<!-- 将静态文件制定到某个特殊的文件夹中统一处理 --> <mvc:resources location="/resources/" mapping="/resources/**"/>
这样我们只要在webroot目录下创建一个resources目录,再将所有文件放入此目录,通过<%=path%>/resources/filename就可以访问了。