发表于: 2018-03-07 23:43:24

3 686


今日完成:

1.       转发与重定向(带参数不带参数)https://www.cnblogs.com/xiaolive/p/4962522.html

request.getRequestDispatcher("p3.jsp").forward(request,response);这种方法称为转发,地址栏上的URL不会改变;

response.sendRedirect("p3.jsp");这种方法称为重定向,地址栏的URL会改变;

基本知识:

请求转发:浏览器首先发请求发送到ServletAServletA进过处理之后把请求传递到ServletB,由ServletB进行继续处理最后输出响应,这个传递的过程称之为请求转发。

                                             

请求转发原理:

浏览器首先发请求发送到ServletA进行处理,由于ServletA由于某种原因无法进行处理,也可能是设计的需求,所以交给ServletB继续进行服务这个时候ServletA就会调用forward()将请求转发给ServletB进行处理。

请求转发定义:

将当前的requestresponse对象交给指定的web组件处理。

说明:

其实在ServletA在调用请求转发的过程中,对于浏览器来说是透明的,浏览器并不知道为其服务的ServletA已经转化为ServletB,对于浏览器来说只是发出了一个请求然后获得一次响应。

注意:

在请求转发的过程中,浏览器的URL地址是不会变的。

 

转发对象RequestDispatcher

要做请求转发首先要获取转发对象,然后调用转发对象的forward()

*RequestDispatcher:转发对象,它是由Servlet容器自动创建的,主要封装一个由路径所标识的服务器资源

--forward():请求转发到对应的服务器资源进行请求处理

--include():把请求发送给另外的web组件之后,原有的组件与被转发的组件都可以输出响应信息

获取转发对象RequestDispatcher

可以通过两种方式获取:

*通过HttpServletRequest获取,也就是说从当前的请求中获取转发对象;

 //创建转发对象:获取转发对象,这个转发对象的参数为需要转发到下个Servlet的路径, 

 //可以填mapping元素的url-pattern对应的地址 

        RequestDispatcher rd = req.getRequestDispatcher("/forwardExample");

*通过ServletContext获取。

//ServletContext对象获取转发对象:1.getNamedDispatche() 

//getNamedDispatche()参数为对象Servlet的名称,即是mapping元素的Servlet-name的名称 

        rd1 = this.getServletContext().getNamedDispatcher( "ServletForwardExample"); 

//ServletContext对象获取转发对象:1.getRequestDispatcher() 

//getRequestDispatcher(),参数只能填绝对路径 

        rd2 = this.getServletContext().getRequestDispatcher("/forwardExample"); 

进行转发,需要把当前的request对象与response对象转发出去,这样forwardExample才能获取到requestresponse对象 

rd.forward(req, resp);

请求重定向:在我们登陆完成之后,服务器端向浏览器返回另外一个URL地址的响应信息,浏览器接收到该响应信息之后会自动的请求服务器端返回的URL地址,最后服务器端返回对应的跳转结果,这样用户就进入了另外的一个页面。

用户请求用于登陆请求的ServletA,服务器端想在用户登录成功之后直接进入到用户的页面,也就是说服务器端在ServletA处理完之后,ServletB继续为用户进行服务,此时ServletA用了sendRedirect()将客户端的请求重定向到ServletB,这个过程就是请求重定向的过程。

请求重定向的定义:

*服务器的Servlet通过response对象发送给浏览器一个新URL地址,让其重新请求。

*两次请求,两次响应

//sendRedirect()参数需要注意,请求重定向可以定向到这个站点的其他web资源,使用绝对路径时, 

//要把当前web资源</span>加入进来,简单起见,使用相对路径(mapping元素下的相对路径) 

        resp.sendRedirect("redirectExample");   //重定向后获取不到参数

 

转发(Forward

转发市通过RequestDispatcher对象的ForwardHttpServletRequest requestHttpServletResponse response)来实现的,语法格式如下所示:

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet");  

dispatcher.forward(request, response);

servlet页面跳转的路径是相对路径,转发方式只能跳转到本web应用中的页面上,跳转后浏览器地址栏不会改变,转发是最常用的方式

把结果通过request.setAttribut()放到request中,然后转发到jsp中进行显示,当执行转发方法时,不能有任何输出到达客户端,否则会抛出异常,也就是说,在转发之前,不要使用out.println()语句向客户端输出

 

重定向(Redirect

重定向和跳转的区别:跳转是在服务器端实现的,客户端浏览器并不知道该浏览动作,而使用Redict跳转时,跳转是在客户端实现的,也就是说客户端浏览器实际上请求了两次次服务器。

response.sendRedirect("URL");

跳转后浏览器地址栏发生变化,这种方式要传值出去的话,只能在url中带parameter或者是放在seesion中,无法使用request.setAttribute来传递。

 

转发是服务器行为,重定向是客户端行为,从请求次数和请求的资源地址两个方面来理解一下她们之间的区别,首先从请求次数来说,重定向行为是做了两次请求,以及产生了两个request对象,重定向会导致request对象信息丢失。转发是做了一次请求,浏览器地址栏一直是第一次请求的地址,转发是服务器内部request/response控制权的移交。

从请求资源的角度来看,重定向是weib自荐可以将请求重定向到任意一个url,而不仅仅是同一个应用,重定向的源组件与目标组件不公用同一个HttpServletRequest对象,因此不能在request范围内共享数据。转发的源组件与目标组件必须在同一个应用总,两者可以在request范围内共享数据。

 

小结:

转发

a、转发不会改变浏览器的地址栏

b、转发共享同一个request

c、转发只能在同一个web应用中使用

重定向:

a、重定向会改变浏览器的地址栏

b、重定向不共享request

c、可以重定向到任意URL

 

 

转发在服务器端完成的;重定向是在客户端完成的

转发的速度快;重定向速度慢

转发的是同一次请求;重定向是两次不同请求

转发不会执行转发后的代码;重定向会执行重定向之后的代码

转发地址栏没有变化;重定向地址栏有变化

转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

1)  从一个controller跳转到另一个controller,不带参数

方式一:使用ModelAndView

return new ModelAndView("redirect:/toList");

     这样可以重定向到toList这个方法

方式二:返回String

          return "redirect:/ toList ";

 方式三:使用response

          response.sendRedirect("test.jsp");  

2)  带参数

方式一:自己手动拼接url

     new ModelAndView("redirect:/toListparam1="+value1+"&param2="+value2);

     这样有个弊端,就是传中文可能会有乱码问题。

方式二:用RedirectAttributes,这个是发现的一个比较好用的一个类

     这里用它的addAttribute方法,这个实际上重定向过去以后你看url,是它自动给你拼了你的url

     使用方法:

              attr.addAttribute("param", value);

              return "redirect:/namespace/toController";

         这样在toController这个方法中就可以通过获得参数的方式获得这个参数,再传递到页面。过去的url还是和方式一一样的。

方法三:带参数不拼接url

    @RequestMapping("/save")

public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)

          throws Exception {

String code =  service.save(form);

                    if(code.equals("000")){

                          attr.addFlashAttribute("name", form.getName());

                          attr.addFlashAttribute("success", "添加成功!");

                          return "redirect:/index";

                    }else{

                          attr.addAttribute("projectName", form.getProjectName());

                          attr.addAttribute("enviroment", form.getEnviroment());

                          attr.addFlashAttribute("msg", "添加出错!错误码为:"+rsp.getCode().getCode()+",错误为:"+rsp.getCode().getName());

                          return "redirect:/maintenance/toAddConfigCenter";

                        }

}

  注意:1.转发的方法参数不会跟在URL后面,重定向的见23

2.使用RedirectAttributesaddAttribute方法传递参数会跟随在URL后面

        3.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.

如果使用了RedirectAttributes作为参数,但是没有进行redirect呢?这种情况下不会将RedirectAttributes参数传递过去,默认传forward对应的model

2.       杂事

ModelMap 返回结果页面的数据,添加到modelandview或者return “index“ 可以将结果返回到结果页面

ModelAndView(index);              转到index.jsp

ModelAndView(forward:index);        转发到index controller

ModelAndView(redirect:index);        重定向到 index controller

modelandview重定向:mav.addObject("a", "a");//重定向出现在url后面

 

controller中获取重定向参数@RequestPrama

                   

3.       JspServlet的关系

JSP一般的运行方式为:当服务器启动后,当Web浏览器端发送过来一个页面请求时,Web服务器先判断是否是JSP页面请求。如果该页面只是一般的HTML/XML页面请求,则直接将HTML/XML页面代码传给Web浏览器端。如果请求的页面是JSP页面,则由JSP引擎检查该JSP页面,如果该页面是第一次被请求、或不是第一次被请求但已被修改,则JSP引擎将此JSP页面代码转换成Servlet代码,然后JSP引擎调用服务器端的Java编译器javac.exeServlet代码进行编译,把它变成字节码(.class)文件,然后再调用JAVA虚拟机执行该字节码文件,然后将执行结果传给Web浏览器端。如果该JSP页面不是第一次被请求,且没有被修改过,则直接由JSP引擎调用JAVA虚拟机执行已编译过的字节码.class文件,然后将结果传送Web浏览器端。

4.       jdbc分页

select* from tb_product order by id desc limit ?,?"

order by id:按照id进行升序排列

order by id desc :按照id进行降序排列

limit ? ? 第一个问好表示从第几个记录开始(从0开始算),第二个问好表示取多少记录

select count(*) from tb_book

求出总记录数,然后得出页数与每页显示记录数

5.       UUID

UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的重要部分。

可以将其理解成当前时空下唯一的一串字符串。通常用在激活码或者是ID上。

比如,用户使用邮箱进行注册了,但是怎样判断你这个邮箱是否是真实存在的呢,那么此时就可以给用户注册邮箱当中发送一封激活链接,链接当中包含了激活码。使用uuid进行唯一性判断

import java.util.UUID;

 public class UTest {

 public static void main(String[] args) {

 UUID uuid = UUID.randomUUID();

 System.out.println(uuid);

 }

 }

明日计划:

1.       拦截器、过滤器、监听器,AOP

2.       任务5自媒体分享

3.       提交任务5

4.       开始任务六

遇到的问题:

1.       暂无

收获:

1.       学习了转发与重定向两个基本概念以及使用requestreponse进行实现,ModelAndView+RedirectArrtubites进行实现

2.       jspservlet关系,jdbcUUID



返回列表 返回列表
评论

    分享到