SSH_JSP相关技术详解学习(1)  






相关技术Servlet Listener Filter 自定义标签

1.web.xml



--WEB-INF



             --classes



             --lib



             --web.xml



--index.jsp






 web.xml功能包括 配置JSP,配置和管理Servlet, 配置和管理Listener , 



 配置和管理 Filter ,配置标签库, 配置JSP属性 配置和管理JAAS授权认证,配置和管理资源引用,Web应用首页






2.JSP的基本原理



    2.1旧式JSP包括两部分:



         --静态部分:标准的HTML标签,静态的页面内容



         --动态部分:受JAVA控制的内容,由JAVA程序动态生成






    2.2旧式的JSP工作原理



         JSP文件必须在JSP服务器内运行



         JSP文件必须生成Servlet才能执行




         JSP页面的访问者无需安装客户端,只需要能够解析HTML就OK






    2.3JSP技术实质是对Servlet技术的一种升级,使得表现层技术和逻辑层有机会可以分离 



    运行的机制是 通过JSP技术生产相关的页面,通过JSP服务器解析成相关的Servlet代码,通过编译后生产HTML页面返回






    2.4JSP注释语法



   <%--  JSP内注释 --%>        :只在JSP中存在,解析成HTML后就会消失





   



   2.5JSP声明语法



   <%! 声明部分 %>    :声明实质就是在Servlet中嵌入JAVA代码,不能声明抽象方法,且因为每个Servlet容器中只有一个实例,如果再声明语法中声明了公共变量,该公共变量对所有页面都是可见的;






   2.6JSP输出语法 



   <%= 表达式 %>       :实质就是在Servlet的方法中使用 out.print(表达式);方法






   2.7JSP脚本语法



   <%   表达式 %>       :实质就是在Servlet的方法中使用 out.write(表达式);方法









   2.8JSP中连接数据库实例



<

%@ page import="java.sql.*"%>
 
  
...
 
  
 <%
 
  
//注册数据库驱动
 
  
Class.forName("com.mysql.jdbc.Driver");
 
  
//获取数据库连接
 
  
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee","root","32127");
 
  
//创建Statement
 
  
Statement stmt = conn.createStatement();
 
  
//执行查询
 
  
ResultSet rs = stmt.executeQuery("select * from newsinf");
 
  
%>
 
  
...
 
  
<%
 
  
while(rs.next()){
 
  
%>
 
  
...
 
  
<%=rs.getString(1)%>
 
  
...
 
  
<%}%>










  2.9JSP常用的3个编译指令



page: 该指令是针对当前页面的指令



include:用于指定包含另一个页面



taglib:用于定义和访问自定义标签



使用编译语法如下:


<%@ 编译指令名 属性名=”属性值“...%>
 
  

 
  
<%page
 
  
[language="Java"] --默认JAVA
 
  
[extends="package.class"] --编译产生的JAVA类所继承的父类或实现的接口
 
  
[import="package.class|package.*,..."] --默认导入 java.lang.* ;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*;
 
  
[session="true|false"] --该JSP是否需要HTTP Session
 
  
[buffer="none|8kb|size bk"] --指定输出缓冲区大小
 
  
[autoFlush="true|false"] --当输出缓冲区即将溢出,是否需要强制输出
 
  
[isThreadSafe="true|false"] 
 
  
[info="text"] --设置JSP程序的信息,也可以看做其说明,通过Serlvet.getServletInfo() 方法获取该值 
 
  
[errorPage="relativeURL"] --指定错误处理页面
 
  
[contentType="mimeType[;charset=characterSet]"|"text/html;charSet=ISO8859-1"] --设定生成网页的文件格式和编码方式,即MIME类型和页面字符集类型,默认的MIME类型是text/html;默认的字符集类型是ISO-8859-1
 
  
[isErrorPage="true|false"] --本页面是否为错误处理页面
 
  
%>
 
  
...
 
  
<%@ page contentType="text/html"; charset="gb2312" language="java" %>
 
  
<%@ page import="java.sql.*" %>





include指令



使用include指令可以把一个外部文件嵌入到当前的JSP文件中,同时解析这个页面的JSP语句(如果有),这是个静态的include语句,会把目标页面的其他编译指令也包进来,但是动态的include不会



语法<%@ include file = "relativeURLSpec"%>



如果嵌入的文件经常需要改变,建议使用<jsp:include>操作指令(动态的)






2.10JSP的7个动作指令



jsp:forward:将请求处理转发到下一个页面



jsp:param:传递参数,必须要和其他支持参数的标签一起使用



jsp:include:动态导入一个JSP



jsp:plugin:下载JAVABean 或 Applet到客户端



jsp:useBean:创建一个JAVABEAN实例



jsp:setProperty:设置JAVABEAN实例属性值



jsp:getProperty:输出JAVABEAN实例的属性值






forward



<jsp:forward page="{relativeURL|<%=expression%>}" />






include



动态include标签,不会导入指定JSP的编译指令,仅仅是把被导入页面的body内容插入本页面



静态导入是把被导入页面的代码完全融入,两个页面融合成一个整体Servlet,而动态导入是在Servlet中使用include方法来引入被导入页面的内容






useBean、setProperty、getProperty



useBean用于在JSP页面中初始化一个JAVA实例,setProperty用于为JavaBean实例的属性设置值,getProperty用于输出JavaBean实例的属性



其实质相当于是在JSP页面中import对象类,然后对象类实例化,再通过pageConext.setAttribute("XXX",XXX);等设置或者获取方法






plubgin



主要用于下载服务器端的JavaBean或Applet到客户端执行,由于程序再客户端执行,所以客户端必须安装虚拟机






param



用于设置参数值,这个指令本身不能单独使用



可以和 jsp:include  jsp:forward  jsp:plugin 连用






2.11JSP脚本中的9个内置对象



JSP脚本包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范将他们完成了默认初始化(由JSP页面对应的_jspService()方法来创建这些实例),其中respsonse request session 是在javax.serlvet.http.*下面;out、pageContext是在javax.servlet.jsp.*下面






application



 javax.servlet.ServletContext实例,代表JSP所属的Web应用本身,可用于JSP页面或者在Servlet之间交换信息,常用方法有getAttribute(String)、setAttribute(String,String)和getInitParameter(String)






config


javax.servlet.ServletConfig实例,代表该JSP的配置信息,常用方法有getInitParameter(String) 和 getInitParameternames(String),该对象时在Servlet中有效,通常JSP页面无须配置






exception



javax.lang.Throwable实例,代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用。常用方法为getMessage()和printStackTrace()






out



javax.servlet.jsp.JspWriter实例,代表JSP页面的输出流,用于输出内容,形成HTML页面





page



代表页面本身。也就是Servlet中的this,其类型就是生产的Servlet,能用page的地方就能用this






pageContext



javax.servlet.jsp.PageContext实例,代表该JSP页面的上下文,使用该对象可以访问页面中的共享数据。常用方法有getServletContet()和getServletConfig()




request


javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都背封装在该对象里。获取客户端请求参数必须使用该对象。常用方法为getParameter(String)、getParameterValues(String)、setAttribute(String,String)、getAttribute()和setCharacterEncoding(String)等





response



javax.servlet.http.HttpServletResponse的实例,代表服务器端对客户端的相应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。而response对象常用语重定向,常用方法有 getOutputStream()、sendRedirect(java.lang.Stringlocation)等



session


javax.servlet.http.HttpSession的实例,代表一次会话。当客户端浏览器和站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。常用方法有:getAttribute(String)、setAttribute(String,String)等





在Tomcat的work\Catalina\localhost\jspPrinciple\org\apache\jsp路径下,存有JSP页面生产的Servlet类文件,其中的_jspServlce方法包含有这9个对象的初始化,request\response两个是_jspService()方法的形参,Tomcat调用该方法时会初始化这两个对象,其余7个对象都是_jspService()放的局部变量








2.12



application



WEB应用其实也是C/S结构的,服务器是Web服务器,客户端是浏览器


对于每次客户端请求而言,Web服务器需要完成


    1)启动单独的线程

    2)使用IO流读取用户的请求数据



    3)从请求数据中解析参数



    4)处理用户请求


    5)生产响应数据



    6)使用IO流向客户端发送请求数据


其中3,4,5由web服务器完成,当我们编写JSP页面时,页面里面的静态内容、JSP脚本都会转化成_jspService()方法的执行代码,这些执行代码负责完成解析参数、处理请求、生产响应等业务功能,而Web服务器则负责完成多线程、网络通信等底层功能


Web应用里面的JSP页面、Servlet等程序都将由Web服务器来调用,为了方便其通信,web服务器提供了4个类MAP结构 application、session、request、page,允许JSP、Servlet将数据存放到这4个结构中,并允许从取数据。


application对整个Web应用有效


session仅对一次会话有效,数据可被本次会话的所有JSP、Servlet访问



request仅对本次请求有效


page仅对当前页面有效




application对象通过有两个作用:


1在整个WEB应用的多个JSP、Servlet间共享数据

2)访问Web应用的配置参数 


web.xml文件中使用context-param元素配置的参数对整个Web应用有效,可以通过application对象来操作


config


代表当前JSP配置信息,在JSP中用的少,但在Servlet中使用较多,因为Servlet需要在web.xml中配置,可以用来web.xml中servlet配置的init-param参数






exception



JSP脚本中无需处理异常,因为普通JSP脚本相当于是执行try-catch结构中的try部分,而异常处理页面则负责catch部分,在catch部分的exception对象就是 内置的exception对象


try{
 
  
...
 
  
}catch(Exception exceptioni){
 
  
...
 
  
}finally{
 
  
...
 
  
}





out



out对象代表一个页面输出流,通常用于输出变量值及常量






pageContext



主要用于访问JSP之间的共享数据





      request

         每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中

         客户端发宋请求参数通常分两种情况:

             GET方式,form默认的方式,可以在地址栏中看到参数名和值且数据量不能大于2K

             POST方式,通常使用提交表单(form HTML元素表示)的方式来发送,通常认为POST请求参数的大小不受限制,往往取决于服务器的限制,POST发送的请求参数以及相应的值放在HTML HEADER中传输

通常的使用方式是先设置request的字符集再使用
 <%
....
             request.setCharacterEncoding("gb2312");
             String gender = request.getParameter("gender");
....
%>

         如果GET方式传递的字符中有非西欧字符,需要先转码

....
<%
....
              String rawQueryStr = request.getQueryString();
              String queryStr = java.net.URLDecoder.decode(rawQueryStr,"gb2312");
....
%>

    传递需要使用URLEncoder()类方法

  

   request可以添加范围属性

   request还有一个功能是执行forward或include方法

 

如<%
          getRequestDispatcher("/a.jsp").include(request,response);
..
          getRequestDispatcher("/a.jsp").forward(request,response);
..
%>

 

  response

  代表服务器对客户端的响应。大部分时候,使用更简易的代表页面输出流的out来代替。但是out是Writer的一个子类,无法输出非字符内容

  所以可以用response响应生产图片,response还可以用来重定向,重定向会生产一次新的请求(相当于URL栏输入新的URL)

<%... response.sendRedirect("redirect-result.jsp") ....%>

还可以用于增加Cookie   <% ...     response.addCookie(new Cookie("username", "admin")) ; ...  %>

 

  session对象

 代表一次用户会话(从客户端浏览器连接服务器开始,到客户端浏览器于服务器断开为止)

session通常用来跟踪用户的会话信息,如判断是否登录系统等

session范围的属性会在多个页面的跳转之间共享

session有setAttribute(String,Object) 和 getAttribute(String)方法