今天完成的事情:
看了一天的资料和博文,因为没基础,所以什么都得查
了解拦截器和转发与重定向的区别.
然后弄这个bug,没有成功,到晚上才找到一个原因,对form表单不熟悉,然后找到一篇长博文,看上去很dio~
博文地址:http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html
突然发现有点偏离了任务要求,不过我觉得这些基础还是要会的,就多花些时间好了...
明天计划的事情:
明天啃完长博文并做好笔记,然后解决这个bug
遇到的问题:
在网上学了一个这个,但好像还是不行啊,用post,get就报错,用get,post就报错


然后找到了这个模板里按钮的路径*(上面那个)下面那个是我自己搜方法加的,但我想要用那个模板
即
后面的有点懵,看不懂意义,也不懂怎么改,method改过get,也没用.明天看完form表单再试试
收获:
1:forward(转发)与redirect(重定向)
forward(转发)与redirect(重定向)的区别:
1:从地址栏显示来说
forward是服务器请求资源:服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容发给浏览器,浏览器根本不知道服务器发送的内容从哪来,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑发送的一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的URL
2:从数据共享来说:
forward:转发页面和转发到的页面可以共享request里面的数据
redirect:不能共享数据
3:从运用地方来说:
forward:一般用于用户登录的时候,根据角色转发到相应的模块
redirect:一般用于用户注销登录时返回主页面和跳转到其他的网站等
4:从效率上来说
forward:高
redirect:低
本质区别
一句话:转发是服务器行为,重定向是客户端行为
动作流程:
转发过程:客户端浏览器发送http请求--->web服务器接收此请求--->调用内部的一个方法在容器内部完成请求处理和转发动作--->将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内request(请求).在客户端浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的.转发行为是浏览器只做了一次访问请求
重定向过程:客户浏览器发送http请求--->web服务器接收后发送302状态码响应及对应新的location给客户端浏览器--->客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是location地址--->服务器根据此请求寻找资源并发送给客户;在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,就没什么request传递的概念了.在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化.重定向行为是浏览器做了至少两次的访问请求
那么,什么是两次访问请求:
第一次,客户端请求A,服务器响应,并反映回来,告诉浏览器,你应该去B,这时IE可以看到地址变了,而且历史的回退按钮也亮了..重定向可以访问自己web应用以外的资源.在重定向的过程中,传递的信息会被丢失.而转发是服务器内部把对一个请求/响应的处理权移交给另外一个.对客户端来说,它只知道自己最早请求的按个A,而不知道中间的B,甚至C,D,传输的信息不会丢失
实例解释:
假如你去办理执照:
重定向:你先去A局,A局表示不归他们管,叫你去B局.然后你就从A退了出来,自己乘车去B局
转发:你先去A局,A局看了后知道这事由B局管,但没有把你退回来,让你坐会喝茶,然后自己去联系B局的人,让他们办好后送过来
两者内部机制的区别:
1:
请求转发只能将请求转发给同一个web应用的组件
而重定向还可以重新定向到同一站点不同程序中的资源,甚至可以定向到一绝对的URL
2:
重定向可以看见目标页面的URL
转发只能看见第一次访问的页面URL,以后工作都是服务器来做的
3:
请求响应调用者和被调用者之间共享相同的请求对象和响应对象
重定向调用者和被调用者属于两个独立访问请求和响应过程
4:
重定向跳转后必须加上return,不然页面虽然跳转,但是还会执行跳转后面的语句.
转发是执行了跳转页面,下面的代码就不会再执行
2:拦截器配置

3:拦截器文件
自己的一点理解:
在java的包(与三层架构平层)下创建一个类继承一个HandlerInterceptorAdapter.然后@Autowired自动装配.接下来是三个方法:
自定义SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法
方法1:preHandle方法是进行处理器拦截用的,顾名思义,该方法将在controller处理之前进行调用
1:springmvc中的interceptor拦截器是链式的,可以同时存在多个interceptor
2:springmvc会根据声明的前后顺序一个个执行,且所有控制器中的prehandle方法都会在控制器方法调用之前调用
3:springmvc的这种拦截器链式结构可以进行中断,中断方式为令preHandle的返回值为false,如果如此,整个请求就结束了
方法2:postHandle是用来进行处理器拦截用的,它的执行时间是在处理器进行处理之后,也就是控制器方法调用之后执行.但它会在DispatcherServlet进行视图的渲染前执行,也就是说在这个方法中可以对ModelAndView进行操作
1:这个方法只会在当前这个拦截器的preHandle方法返回值为true时才会执行
2:这个方法的链式结构跟正常访问的方向相反,即先声明的拦截器该方法反而会后调用
方法3:afterCompletion是用来在整个请求完成之后,即DispatcherServle渲染了视图执行,主要是用来清理资源的.需要当前拦截器的preHandle方法的返回值为true时才会执行
评论