发表于: 2018-03-07 23:43:24
3 683
今日完成:
1. 转发与重定向(带参数不带参数)https://www.cnblogs.com/xiaolive/p/4962522.html
request.getRequestDispatcher("p3.jsp").forward(request,response);这种方法称为转发,地址栏上的URL不会改变;
response.sendRedirect("p3.jsp");这种方法称为重定向,地址栏的URL会改变;
基本知识:
请求转发:浏览器首先发请求发送到ServletA,ServletA进过处理之后把请求传递到ServletB,由ServletB进行继续处理最后输出响应,这个传递的过程称之为请求转发。
请求转发原理:
浏览器首先发请求发送到ServletA进行处理,由于ServletA由于某种原因无法进行处理,也可能是设计的需求,所以交给ServletB继续进行服务这个时候ServletA就会调用forward()将请求转发给ServletB进行处理。
请求转发定义:
将当前的request和response对象交给指定的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才能获取到request与response对象
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对象的Forward(HttpServletRequest request,HttpServletResponse 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:/toList?param1="+value1+"¶m2="+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后面,重定向的见2,3
2.使用RedirectAttributes的addAttribute方法传递参数会跟随在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. Jsp跟Servlet的关系
JSP一般的运行方式为:当服务器启动后,当Web浏览器端发送过来一个页面请求时,Web服务器先判断是否是JSP页面请求。如果该页面只是一般的HTML/XML页面请求,则直接将HTML/XML页面代码传给Web浏览器端。如果请求的页面是JSP页面,则由JSP引擎检查该JSP页面,如果该页面是第一次被请求、或不是第一次被请求但已被修改,则JSP引擎将此JSP页面代码转换成Servlet代码,然后JSP引擎调用服务器端的Java编译器javac.exe对Servlet代码进行编译,把它变成字节码(.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. 学习了转发与重定向两个基本概念以及使用request和reponse进行实现,ModelAndView+RedirectArrtubites进行实现
2. jsp和servlet关系,jdbc,UUID
评论