JSP

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应用的配置信息和配置参数。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值