JSP
1、
<%@ file=”” %> 静态包含,等于说将代码复制到文件中,然后一块编译,效率高一点点,不可以传递参数,””内容不可以为变量
2、
<jsp:include page=”1.jsp” ></jsp:include> 动态包含,等于两个一块编译,然后在本文件生成的.java用方法把request和response传递给2.jsp 生成的java文件,相当于一个类调用另一个类,可以传递参数, “ 内容可以为变量!
可以通过?传递参数
可以通过<jsp:paramvalue=”” name=””> 传递参数
3、
<jsp :forward page=”” ></jsp:forward> 网页重定向,也可以传递参数,同其他jsp动作指令一样传递参数
但是重要的一点是,重定向完成后,还可以不续执行下面的代码,但是在servlet中的forward方法中是可以继续执行下面的代码,原因在于jsp引擎在生成这个方法时,在最后加了一个return ,整个方法都结束了
4、
<jsp:useBean id=”” class=”” scope=”” > </jsp:useBean>
相当于在 scope的作用范围里创建一个类的实例 id=new class() //调用的是空的构造方法,因此创建javaBean时不要忘记了写上空构造方法
<jsp:setProperty property =”” name=”” value=”” />
相当于设置 id=name 这个实例对象的成员变量 property的值为 value
作用于寻找顺序pageContext <request<Session<application 从小到大开始找,找到为止
<jsp:getperty property =”” name=”” />
相当于 get到实例对象name的属性的property的值然后out.print()出来
写的标签其实是Java代码而已,是通过servlet引擎生成的java代码 MVC开发模式
深入理解 page Request session application 四种范围!
1、简单说page 指的是当前页面。在一个jsp页面里有效,一个jsp页面就是一个浏览器项,一个浏览器窗口的一个字页面,还不是总的
只要转移页面就刷新
2、 request指从http请求到服务器处理结束。 范围相应的整个过程。在这个工程中使用forward方式跳转多个jsp。在这些页面里你都可以使用这些变量,
指的是一个客户端请求, 点对点的连接, 一个client 和一个server的连接,就发生了一个request请求,只要这个请求还在,就不会改变内置对象。
刷新页面刷新
3、Session 有效范围是当前会话。 只一个浏览器窗口,不管多少个字页面
关闭浏览器刷新
4、application 它的有效范围是整个应用。
重启 tomcat刷新
作用域里的变量,他们的存货时间是最长的。如果不进行手动删除,它们就可以一直
使用page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了(但有些也有跳转页有保留,其实是把这个页面的Request和reponse等其他对象传递过去,这也是为什么有的方法中有参数)
Request 里的变量可以跨越forward的前后两页,但时只要刷新了页面,他们就重新计算了,这是相当于重新建立的一个点对点的客户端与服务端的连接,server不会记住你这个客户机曾经访问过,你前一秒访问过了,退出后再访问,server是不会记住你前一秒岗刚访问过的
Session 和application 里的变量一直在累加,开始还看不出区别,
对于Session 只要关闭浏览器,再次重启浏览器访问,session就重新计算了
Application 里的一直存在,除非你重启tomcat,他才会刷新(原作者是变大,我不懂)
而作用域规定的变量是有有效期限的
如果把变量放到pagecontext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。到jsp页面结束,你都可以使用这个变量。’
如果把变量放在Request里,就说明它的作用域是Request,它的有效范围是当前请求周期。所为请求周期,就是指从http请求发起,到服务器处理结束,返回相应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,但时它的Request对象是不会变的,原因是forward跳转的时候传递的是原来页面的Request变量。
如果把变量放在session里,就说明它的作用域是session,它的有效范围是当前会话。
所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程也可能包含多个请求响应,只要用户不关浏览器,服务器就有办法知道这些请求是一个客户端发起的,整个过程被称之为一个会话(session),而放在会话中的变量,就可以在当前会话的请求里使用。
如果把变量放在application里,就说明它的作用域是application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束,我们没有说从服务器启动,到服务器关闭,这是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面的所有应用关闭了。也就刷新了所有对象
但时可以设置他们的存活时间。
不同的是,application里的变量是可以被所有用户,就是访问这个web项目的用户,只是这个项目,其他的项目用户不共享,如果一个用户修改了application中的变量,另一个用户访问时得到的变量就是修改后的值,这就有很大的漏洞,注意安全问题,但时对于page,Request,session,都不会存在这样的问题,因为他们对于用户之间是完全隔离的,无论如何修改都不会影响其他人的数据。
Web开发中的域问题:PageContext,Request,Session,ServletContext(Application)
Web开发中的四个域对象(范围由小到大):
page(jsp有效) request(一次请求)session(一次会话)application(当前web应用)
page域指的是pageContext.
request域指的是HttpServletRequest
session 域指的是HTTPSession
application 域指的是ServletContext
之所以他们是域对象,原因就是他们都内置了map集合,都有setAttribute getAttribute方法。而且他们的name都是String类型,而value都是Object类型。
他们都有自己固定的生命周期和作用域。
这四个对象的生命周期(生命周期就是值对象的创建到销毁的期间):
page:jsp页面被执行,生命周期开始,jsp页面执行完毕,声明周期结束。
request:用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束。
session:用户打开浏览器访问,创建session(开始),session超时或被声明失效,该对象生命周期结束。
application:web应用加载的时候创建。Web应用被移除或服务器关闭,对象销毁。[结束]。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:
1.Page只在当前jsp有效,每次请求分别对应不同的request.
2.Request,只在当前请求有效,每次请求分别对应不同的request域
【Request域】可以调用request这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。也可以使用getParameter(Stringname) return String来获取XML里传递给它的参数。
String data = "XBY request";
request.setAttribute("data4",data);
request.getRequestDispatcher("/1.jsp").forward(request, response);
Request可以用于Forward
String data =(String)request.getAttribute("data");
out.write(data);
【如果在forward前将在Servlet程序中写入的部分内容已经被真正地传送到客户端,forward方法将抛出IllegalStateException异常。】关键在跳转后要return.
如果在调用Forward方法前向servlet引擎的缓冲区(response)中写入内容,只要写入到缓冲区的内容还没有真正输出到客户端,forward方法将可以被正常执行,原来写入到缓冲区的内容 会被清空,但是,已经写入到HttpServletResponse对象的响应字段信息保持有效。
Forward请求转发特点:
1.客户端只发出了一次请求,而服务器端有多个资源调用
2.客户端浏览器端RUL不会变化。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
3.Session只在一次会话中有效,会话结束就无法取到数据了。getAttribute(String name) return Object
HttpSession session = request.getSession();
session.setAttribute("name", "电视");
response.setCharacterEncoding("UTF-8");//处理中文乱码问题
response.setContentType("text/html;charset=UTF-8");//处理中文乱码问题
PrintWriter out = response.getWriter();//处理中文乱码问题
HttpSession session = request.getSession();
String product = (String)session.getAttribute("name");
out.write(product);
只有当getSession()时,服务器才会为该浏览器创建session,他的生命周期默认为30min。
<session-config>
<session-timeout>10</session-timeout>
</session-config>
当使用request.getSession(false);时,就是查看session,不生成session.例如在查看已购买东西时,会使用。//ie8的话,开2个浏览器还是共享一个session,ie7是服务器把sessionid写进了浏览器的进程中,而ie8是服务器实现了多个同一款浏览器的session共享。
【cookie】如果没有指定Cookies对象的有效期,则Cookies对象只存在于客户端的内存。当浏览器关闭时,Cookies就会失效。
HttpSession session = request.getSession();
String sessionid = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionid);
cookie.setPath("/servlet");
cookie.setMaxAge(30*60);
response.addCookie(cookie);
session.setAttribute("name", "电视");//重新写cookie。设置时间。
如果禁用cookie,就是使用利用URL重写技术让浏览器的URL带上SESSIONID。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
4.application:在JSP自动生成的Servlet文件中,是这样定义的:final javax.servlet.ServletContext application;
ServletContext域:
1.这是一个容器
2.说明这个容器的作用范围是整个应用程序范围
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="xby ok";
this.getServletContext().setAttribute("data", data);
System.out.println("write ok!");
}
public void doGet(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException, IOException {
String value =(String)this.getServletContext().getAttribute("data");
System.out.println(value);
}
【补】ServletContext可以转发Servlet,但是Servlet不方便显示。
forward:
String data="xby yes!";
this.getServletContext().setAttribute("data", data);
RequestDispatcher rd =this.getServletContext().getRequestDispatcher("/1.jsp");
rd.forward(request, response);
这样不好,因为涉及到多线程问题,ServletContext会被同一应用中的所有Servlet所共享】
通过ServletContext读取web资源:
InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties props = new Properties();
props.load(in);
String username = props.getProperty("username");
String passwd = props.getProperty("passwd");
获得资源文件路径(用于上传下载):
String path=this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
FileInputStream in = new FileInputStream(path);】
使用ServletContext管理相关的资源。webapp都是在jvm下执行的,所以绝对路径就是在jvm的路径。
ServletContext会在服务器启动时创建,目录在webapps中;服务器停止时会销毁这个ServletContext.------------------------------------------------------------------------------------------------------------------------------------------------------------- -
四个域对象在选择的时候,能用范围小的绝不用范围大的:
page:数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)
(什么时候需要用map了,就用page)
Request:【程序产生数据,数据显示完后就没有用了】
数据只是做显示的,看完了就没用了。就存request域,请求转发,Servlet产生的处理结果(数据)交给jsp显示。数据转发可以带数据。
Session:【程序产生数据,显示后等会还需要使用】
数据给用户看完了,一定还要用,会话结束了就没用了
用户登录,用户信息发给客户端看,看完了,一会访问别的页面还要看用户信息。
购物车,购物车成功了,给用户看购物车,待会随时间可以查看购物车
请求重定向,因为是两次请求,每一次请求的数据,第二次请求还要看。
application:【ServletContext在jsp中另一个名字就是application,数据显示后,等会还需要用,还需要给别人用,例如聊天室】
数据给一个用户用完了,别人还要用;
聊天室,聊天记录,需要给所有的用户看;统计网站在线人数,所有看到的应该是一个数
【总结】:四个域对象在选择的时候,能用范围小的绝不用范围大的。
1.需要定义Map时不如用page,
2.请求Servlet,转发给jsp的数据存request,
3.请求重定向带过去的数据存Session,
4.全局的数据存application。
4.ServletContext:WEB容器在启动时,他会为每一个【WEB应用程序】都创建一个对应的ServletContext对象,它代表【当前WEB应用】,驻留在服务器的内存里。
在一个contex中的数据都是共享的,它是web应用的配置信息和配置参数。