SpringMvc

一个基于spring的框架,实际上就是spring的一个模块,专门做web开发的,理解是servlet的一个升级。web开发底层是servlet,框架是在servlet基础上加入一些功能,让你做web更方便。

springmvc就是一个spring.spring是容器,ioc能够管理对象,使用<bean>,@Component,@Repositoty,@Service,@Controller. springmvc能够创建对象,放入到容器中,springmvc中放入的是控制器对象。我们要做的是使用@Controller创建控制器对象,把对象放入springmvc容器中,把创建的对象作为控制器使用,这个控制器对象能接收用户的请求,显示处理结果,就当作是一个servlet使用。

使用@Controller创建的是一个普通类的对象,不是servlet.springmvc赋予了控制器对象一些额外的功能。

web开发底层是servlet,springmvc中有一个对象是servlet,dispatcherServlet

DispatcherServlet:负责接收用户的所有请求,用户把请求给了DispatcherServlet,之后DispatherServlet把请求转发给我们的Controller对象,最后Controller对象处理请求。

index.jsp---------------dispatherServlet-------转发/分配给controller对象(@Controller注解创建的对象)

main.jsp                                                              MainController

addUser.jsp                                                        UserController

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

springmvc请求的处理流程

1)发起some.do

2)tomcat(web.xml,url-pattern知道*.do的请求给DispatcherServlet)

3)DispatcherServlet根据springmvc配置知道some.do对应doSome()方法

4)DispatcherServlet把some.do转发给MyController.doSome()方法

5)框架执行doSome()把modelAndVies进行处理,转发到show.jsp

简化:some.do------>DispatcherServlet------->MyController

springmvc执行过程源代码分析

1,tomcat启动,创建容器的过程

通过load-on-start标签指定的1,创建DispatcherServlet对象。Diapatcher它的父类继承HttpServlet,它是一个servlet,在创建时执行init()方法:

// 创建容器 读取配置文件

WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");

// 把容器对象放入到ServletContext中

getServletContext.setAttribute(key,ctx);

作用:创建@Controller注解所在的类的对象,创建MyController对象,这个对象放入到springmvc容器中,容器时map,类似map.put("myController",myController对象);

2,请求的处理过程

1)执行servlet的service

protect void service(HttpServletRequest request,HttpServletResponse response)

protect void doService(HttpServletRequest request,HttpServletResponse response)

DiapatcherServlet.doDispatch(request,response){

调用MyController的.doSome()方法;

}

 

 

在jsp,html中的地址,都是在前端页面中的地址,是相对地址

1,绝对地址,带有协议名称叫绝对地址如HTTP百度,ftp

2,相对地址,没有协议开头的,例如user/do,/user/some.do,相对地址不可独立使用,必须有一个参开地址,通过参考地址+相对地址本身才能指定资源 

如张皓轩,1班张皓轩,2班张皓轩,这个1和2就是参考

3,参考地址

在你的页面中,访问地址不加 / 

访问:http://localhost:8082/ch02_requestmapping__3__war_exploded/index.jsp

其中http://localhost:8082/ch02_requestmapping__3__war_exploded/是地址,index.jsp是资源

 

在index.jsp发起user/some.do请求,访问地址变为http://localhost:8082/ch02_requestmapping__3__war_exploded/user/some.do

当你的地址没有 / 开头,例如user/some.do,当你点击连接时,访问地址是当前页面的地址+上链接的地址http://localhost:8082/ch02_requestmapping__3__war_exploded/+user/some.do

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

index.jsp访问user/some.do,返回后现在的地址http://localhost:8082/ch06_path_war_exploded/user/some.do

路径:http://localhost:8082/ch06_path_war_exploded/user/

资源:some.do

不加 /  ,变成了http://localhost:8082/ch06_path_war_exploded/user/user/some.do两个user,错了

解决方案:

1)${pageContext.request.contextPath}

2)加入一个base标签,是HTML中的标签,表示当前页面中访问地址的基地址(你页面中所有没有以 / 开头的地址,都是以base标签中的地址为参考地址)

使用 base中的地址 + user/some.do组成访问地址

 

在你的页面中,访问地址加 / 

访问:http://localhost:8082/ch02_requestmapping__3__war_exploded/index.jsp

其中路径是http://localhost:8082/ch02_requestmapping__3__war_exploded/是地址,index.jsp是资源

 

在index.jsp发起 /user/some.do请求,访问地址变为http://localhost:8082/user/some.do,参考地址是:http://localhost:8082,也即是你的服务器地址,不全,因此代码上得写全,

代码上写全了,那以后改的话咋办?比较麻烦。解决方法就是加${pageContext.request.contextpath}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------index.jsp---->addStudent.jsp---->student/addStudent.do(service方法 调用dao的方法)---->result.jsp

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

异常处理:

mvc采用的是统一,全局的异常处理,把controller的所有异常处理都集中到一个地方,采用的是aop思想,把业务逻辑和代码分来,解耦合。

使用两个注解:

1,@ExceptionHandler

2,ControllerAdvice

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------lanjieqi拦截器

1)拦截器时springmvc的一种,需要实现handlerinterceptor接口

2)拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤器请求参数,设置编码字符集等工作,拦截器是拦截用户的请求,做请求做判断处理的

3)拦截器是全局的,可以对多个controller做拦截,一个项目中可以有0个或者多个拦截器,他们一起拦截用户的请求,拦截器常用字用户登录处理,权限检查,记录日志

拦截器使用步骤:

1,定义类实现handlerInterceptor接口

2,在mvc配置文件中,声明拦截器,让框架知道拦截器的存在

拦截器的执行时间:

1)在请求处理之前,也即是controller类中的方法先被拦截

2)在控制器方法执行以后也会执行拦截器

3)在请求处理完成后也会执行拦截器

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值