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)方法