JSP执行流程和JSP的内置对象request和session解析比较

来源:互联网 发布:淘宝人工客服打不进去 编辑:程序博客网 时间:2024/05/21 20:25
JSP : JAVA SERVER PAGES JAVA服务器端页面

JSP执行图



1. HTTP协议是基于请求和响应的,请求之后就只等着响应其余的操作都在服务器端完成。所有的程序代码都是在服务器端执行的,返回给浏览器的只是静态的页面
2. 从途中可以看出,JSP文件被JSP解析器成了一个.java文件 也就是servlet, 然后再编译成一个.class文件 所以说jsp是一种servlet,JSP最终都会转换成servlet来执行



1.  若是一个JSP文件之前被执行过,也就是已经被编译成了.class文件,那么在没被修改的情况下以后有人再调用的时候,则直接会调用该class文件



1. Template data: 模版数据,相等于HTML页面,是什么就显示什么。
<% %>  内的为JSP元素/JSP脚本段,可以写入JAVA代码,由JDK执行,需要严格遵守JAVA语法

 <!-- 这是HTML注释 -->
  <%--这是JSP的注释 --%>
  <!-- <%= new java.util.Date() %> -->  这是在HTML注释中加入一个JSP表达式,里面的JAVA代码会被执行显示在HTML注释中 

2. 声明格式定义变量和脚本段中定义变量的区别

<%! int f = 8; %>  
 <% int j = 8; %>
 <%=f-- %>
 <%=j-- %>       

<%-- 这样就是JSP的声明和输出 ,在JSP转换为SERVLET时,会将声明的变量转换为成员变量,而在脚本段定义的j是局部变量,执行完就会去除,而成员变量f不会消除 --%>

servlet是单实例的,成员变量f的值只有一个,如果A用户访问了f并修改,那么f的值就改变了,B用户再访问的时候f的值就改变了,而局部变量则是每个用户访问的时都有一份,互不干涉


JSP的指令

page指令

<%@ page language="java" import="java.util.*,"java,io."*" pageEncoding="UTF-8"%>

include指令

body>    <!-- 这是一个包含另外一个jsp文件的语法 -->
 Time is:
 <%@ include file ="includedemo.jsp" %>
</body>


  ==============================================================
  <body>

 <%=(new java.util.Date()).toLocaleString()%>
 </body>
=============================================================


<jsp: forward>标签指令 
用于转向页面,在其后的代码没有机会被执行

 <body>
 <jsp:forward page="forward1.jsp">
  <jsp:param name="userName" value="SS"/>
 </jsp:forward>
 
 <%
 out.println("oo");             //此处代码不会被执行,因为在jsp:forward之后页面已经转向
 %>
 </body>


<jsp:include file="url"> 标签指令

和 <%@ include file ="includedemo.jsp" %>差不多 只不过可以带参数   <jsp:include name="userName" value="SS"/>




实例:一个根据用户提交的表单,使用JSP创造表格的程序

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

</head>

<body>
 <!-- 这是一个根据用户提交的表单 来创造表格的小程序 -->
 <%
  int rows = Integer.valueOf(request.getParameter("rows"));
  int cols = Integer.valueOf(request.getParameter("cols"));
  String result = ""
    + "<table border=4 width=80% align='center'>";
  int k = 1;
  for (int i = 0; i < rows; i++)
  {
   result += "<tr align='center'>";
   for (int j = 0; j < cols; j++)
   {
    result += "<td>" + (k++) + "</td>";
   }
   result += "</tr>";
  }
  result += "</table>";
  out.print(result);
 %>

</body>
</html>

========================================================

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'jsptable.jsp' starting page</title>
   
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">    
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->

  </head>
 
  <body>
 <form action="jsptable1.jsp" method="get">
 请输入行数: <input type="text" name="rows">
 请输入列数: <input type="text" name="cols">
  <input type="submit" value = "提交">
 
 </form>
  </body>
</html>



JSP的内置对象

1. request对象   HttpServletRequest接口实现类对象
 getParameter()/getParameterNames()/getParameterValues()方法的不同

//getParameter只适用于请求参数值只有一个的情况,如果有多个请求参数值,想要获取全部的参数值,使用getParameterValues()方法
 //getParameterNames方法用来取得请求参数中的所有name属性值,返回一个Enumeration容器


</head>
 
  <body>
 <form action="testGetParameter1.jsp">
 username: <input type = "text" name = "username"><br/>
 password: <input type = "password" name = "password"><br/>
 age: <input type = "text" name = "age"><br/>
 age2 <input type = "text" name = "age"><br/>
 
 <input type = "checkbox" name = "lovefruit">苹果
 <input type = "checkbox" name = "lovefruit">橘子
 <input type = "checkbox" name = "lovefruit">柚子
 
 <input type = "submit" value = "提交">
  
 </form>
</body>
===================================================
 </head>
 
  <body>
 <%    //getParameter只适用于请求参数值只有一个的情况,如果有多个请求参数值,想要获取全部的参数值,使用getParameterValues()方法
           //getParameterNames方法用来取得请求参数中的所有name属性值,返回一个Enumeration容器
 
  //输出结果
  /*
  password
  age
  username
  lovefruit
  20
  18*/
 

  Enumeration<String> en = request.getParameterNames();
 
  while(en.hasMoreElements())
  {
   System.out.println(en.nextElement());
  }
 
 
  String [] values = request.getParameterValues("age");
 
  for(String value: values)
  {
   System.out.println(value);
  }
    
 %>
  </body>
</html>


2. Session对象   HttpSession接口的实现类对象

Session对象用来记忆保持客户端的状态,因为HTTP协议是无序的,例如用户登录之后,不会记得用户的登录状态!

session.setAttribute("name", username); 
String username = (String)session.getAttribute("name");                 //这是2个最常用的方法用于将信息保存到session中和取出!



                  request对象的setAttribute() getAttribute()方法解析 
                 以及与session对象的tAttribute() getAttribute()的比较               






并且: session对象对多客户端进行服务器端的访问,保存请求数据时,保存多个客户端提交的请求数据,不会产生冲突,
 而且 :   由于session对象的生命周期特点  (浏览器不关闭就保持存活)  //暂时如此理解

 所以:session对象内的数据,可以经过<jsp:forward>标签 或者<a href="#"></a>进行页面跳转后,也就是说无论用户发送多少个请求,只要session的生命周期还在,其对象内存放的数据都会保存! 而request对象内存放的数据,仅限于request对象的生命周期内(一次请求->得到响应->消亡),当用户发出新的请求(如点击一个连接),服务器会产生一个新的request对象,并且与之前的request对象毫无关系,所以存放在之前request对象内的数据也无法进行提取,所以说session的生命周期往往更大!!








1 0
原创粉丝点击