一、项目中的相对地址和绝对地址问题
在jsp,html中使用的地址,都是在前端页面中的地址,都是相对地址
地址分类:
1.绝对地址 , 带有协议名称的是绝对地址, http://www.baidu.com , ftp://202.122.23.1
2.相对地址, 没有协议开头的, 例如 user/some.do , /user/some.do、相对地址不能独立使用,必须有一个参考地址。 通过参考地址+相对地址本身才能指定资源。3.参考地址
1)在你的页面中的,访问地址不加"/"
路径: http://localhost:8080/ch06_path/
资源: index.jsp
当你的地址 没有斜杠开头,例如 user/some.do , 当你点击链接时, 访问地址是当前页面的地址加上链接的地址。http://localhost:8080/ch06_path/ + user/some.do
-------------------------------------------------------------
index.jsp 访问 user/some.do 返回后现在的地址: http://localhost:8080/ch06_path/user/some.do
http://localhost:8080/ch06_path/user/some.do
路径: http://localhost:8080/ch06_path/user/
资源: some.do
在index.jsp在 user/some.do ,就变为http://localhost:8080/ch06_path/user/user/some.do
解决方案:
1.加入${pageContext.request.contextPath}
2.加入一个base标签, 是html语言中的标签。 表示当前页面中访问地址的基地址。
你的页面中所有 没有“/”开头的地址,都是以base标签中的地址为参考地址
使用base中的地址 + user/some.do 组成访问地址
2)在你的页面中的,访问地址加 "/"
路径: http://localhost:8080/ch06_path/
资源: index.jsp
点击 /user/some.do, 访问地址变为 http://localhost:8080/user/some.do
参考地址是 你的服务器地址, 也就是 http://localhost:8080
如果你的资源不能访问: 加入${pageContext.request.contextPath}
二、处理静态资源访问的两种方法:
说明:在url-pattern中配置的访问路径如果是“/”就需要处理静态资源访问问题、它不会匹配到.jsp等静态资源,只能够匹配到框架的请求,比如“/some”动态资源的请求。
应用:如果想要使用js、jquery……的功能,就必须配置项目能够正确的访问到静态资源!
第一种:在spring让servlet去处理静态资源
告诉mvc处理静态资源的事情交给servlet去做:
添加注解驱动:
原理:给程序内存中增加一个处理器对象,DefaultHtppRequestHandler,让这个对象处理静态资源的访问!
第二种:spring自己去处理静态资源
在Spring3.0版本后,Spring定义了专门用于处理静态资源访问请求的处理器.
ResourceHttpRequestHandler。并且添加了标签,专门用于解决静态资源无法访问问题。需要在springmvc配置文件中添加如下形式的配置:
上面的可以将html、css、js文件都放在统一文件夹“static”目录下。
三、统一处理异常
步骤:
1.新建maven web项目
2.加入依赖
3.新建一个自定义异常类 MyUserException , 再定义它的子类NameException ,AgeException
4.在controller抛出NameException , AgeException
5.创建一个普通类,作用全局异常处理类
1)在类的上面加入@ControllerAdvice
2) 在类中定义方法,方法的上面加入@ExceptionHandler
6.创建处理异常的视图页面
7.创建springmvc的配置文件
1)组件扫描器 ,扫描@Controller注解
2)组件扫描器,扫描@ControllerAdvice所在的包名
3)声明注解驱动
web.xml配置
myweb
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
myweb
/
springmvc配置文件:springmvc.xml
定义异常类:exception/
MyUserException:
1 packagecom.zhixi.exception;2
3 public class MyUserException extendsException {4 publicMyUserException() {5 super();6 }7
8 publicMyUserException(String message) {9 super(message);10 }11 }
View Code
AgeException:
packagecom.zhixi.exception;//当年龄有问题时,抛出的异常
public class AgeException extendsMyUserException {publicAgeException() {super();
}publicAgeException(String message) {super(message);
}
}
View Code
NameException:
packagecom.zhixi.exception;//表示当用户的姓名有异常,抛出NameException
public class NameException extendsMyUserException {publicNameException() {super();
}publicNameException(String message) {super(message);
}
}
View Code
controller进行异常的抛出:controller/
MyController:
packagecom.zhixi.controller;importcom.zhixi.exception.AgeException;importcom.zhixi.exception.MyUserException;importcom.zhixi.exception.NameException;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.RequestMapping;/*** @RequestMapping: value : 所有请求地址的公共部分,叫做模块名称
* 位置: 放在类的上面*/@Controllerpublic classMyController {
@RequestMapping(value= "/some")public String doSome(String name, Integer age, Model model) throwsMyUserException {//根据请求参数抛出异常
if (!"zs".equals(name)) {throw new NameException("姓名不正确!!!");
}if (age == null || age > 80) {throw new AgeException("年龄比较大!!!");
}
model.addAttribute("myname", name);
model.addAttribute("myage", age);return "show";
}
}
View Code
handler负责处理异常:handler/
GlobalExceptionHandler:
packagecom.zhixi.handler;importcom.zhixi.exception.AgeException;importcom.zhixi.exception.NameException;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RequestMapping;/*** @ControllerAdvice : 控制器增强(也就是说给控制器类增加功能--异常处理功能)
* 位置:在类的上面。
* 特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。
* 指定@ControllerAdvice所在的包名*/@ControllerAdvicepublic classGlobalExceptionHandler {//定义方法,处理发生的异常
/*处理异常的方法和控制器方法的定义一样, 可以有多个参数,可以有ModelAndView,
String, void,对象类型的返回值
形参:Exception,表示Controller中抛出的异常对象。
通过形参可以获取发生的异常信息。
@ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,
由当前方法处理*/@RequestMapping
@ExceptionHandler(value= NameException.class)publicString doNameException(Exception exception, Model model){//处理NameException的异常。
/*异常发生处理逻辑:
1.需要把异常记录下来, 记录到数据库,日志文件。
记录日志发生的时间,哪个方法发生的,异常错误内容。
2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。
3.给用户友好的提示。*/model.addAttribute("msg","姓名必须是zs,其它用户不能访问");
model.addAttribute("ex",exception);return "nameError";
}//处理AgeException
@RequestMapping
@ExceptionHandler(value= AgeException.class)publicString doAgeException(Exception exception,Model model){//处理AgeException的异常。
/*异常发生处理逻辑:
1.需要把异常记录下来, 记录到数据库,日志文件。
记录日志发生的时间,哪个方法发生的,异常错误内容。
2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。
3.给用户友好的提示。*/model.addAttribute("msg","你的年龄不能大于80");
model.addAttribute("ex",exception);return "ageError";
}//处理其它异常, NameException, AgeException以外,不知类型的异常
@ExceptionHandlerpublicString doOtherException(Exception exception,Model model){//处理其它异常
model.addAttribute("msg","你的年龄不能大于80");
model.addAttribute("ex",exception);return "defaultError";
}
}
View Code
视图层jsp:/WEB-INF/jsp/
ageError.jsp(年龄异常)
提示信息:${msg}
系统异常消息:${ex.message}
View Code
nameError(名字异常)
提示信息:${msg}
系统异常消息:${ex.message}
View Code
defaultError(其他异常)
提示信息:${msg}
系统异常消息:${ex.message}
View Code
show.jsp(获取数据)
/WEB-INF/view/show.jsp从request作用域获取数据
myname数据:${myname}
myage数据:${myage}
View Code