CS/BS
CS(Client/Server):客户端----服务器结构,服务器通常采用高性能的PC工作站或小型机,并且采用大型数据库系统,如Oracle.Sybase.InFORMix 或 SQL Server 等数据库。客户端需要安装专门的客户端软件。
BS(Browser/Server):浏览器----服务器结构,是目前应用系统的发展方向。客户机上只要安装一个浏览器就好了,服务安装可以是Oracle ,Sybase,InFORMixh或者SQL Server等等数据库.在 这种结构下,用户界面完全通过 www 浏览器实现,一部分事物逻辑在前端实现,但是主要的事物逻辑在服务端实现。浏览器通过Web Server 同数据库进行数据交互。
区别:
- 硬件环境CS用户固定,并且处于相同区域,要求拥有相同的操作系统。BS要有操作系统和浏览器就行。与操作系统平台无关。
- 客户端要求CS客户端的计算机电脑配置要求较高。
- BS客户端的计算机电脑配置要求较低。
- 软件安装CS每一个客户端都必须安装和配置软件,客户端不必安装,使用浏览器访问,易推广。BS最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。
- 软件升级和维护CS每一个客户端都要升级程序。可以采用自动升级。BS客户端不必安装及维护。
- 安全性。
JSP
JSP(Java Server Pages)是JavaWeb服务器端的动态资源,与html页面的作用相似,是一种动态页面技术,显示数据和获取数据,逻辑从servlet中分离出来。在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。
- jsp: 作为请求发起页面,例如显示表单、超链接。 : 作为请求结束页面,例如显示数据。
- Servlet:作为请求中处理数据的环节。
- jsp的组成 jsp = html + java脚本 + jsp标签(指令) jsp中可直接使用的对象一共有9个,被称之为9大内置对象
- 5种jsp格式:
- <%@… %>:jsp指令。
- <%…%>:脚本,写java代码片段,(类似方法)
- <%=…%>:输出表达式,用于输出一条表达式(或变量)的结果。
- <%!…%>:声明,用来创建类的成员变量和成员方法(类似与类)
- <%–… –%>:jsp注释 当服务器把jsp编译成java文件时已经忽略了注释部分!
JSP原理
JSP之三大指令
page指令
实例:<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8”%>
import:等同与import语句
<%@ page import=”java.util.” %>
<%@ page import=”java.util., java.net.” %>
在一个JSP页面中可以给出多个page指令,而且import是可以重复出现的
<%@ page import=”java.util.” %>
<%@ page import=”java.next.*” %>
pageEncoding:指定当前页面的编码
如果pageEncoding没有指定,那么默认为contentType的值;
如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1
contentType:等同与调用response.setContentType(“text/html;charset=xxx”);
如果没有指定contentType属性,那么默认为pageEncoding的值;
如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1
errorPage:如果当前页面出现异常,那么跳转到errorPage指定的jsp页面。
例如:<%@ page errorPage=”b.jsp” %>
isErrorPage:上面示例中指定b.jsp为错误页面,但在b.jsp中不能使用内置对象exception,保有b.jsp中使用<%@page isErrorPage=”true”%>时,才能在b.jsp中使用错误页面。
autoFlush:当autoFlush为true时,表示out流缓冲区满时会自动刷新。默认为true
buffer:指定out流的缓冲区大小,默认为8KB
isELIgnored:当前JSP页面是否忽略EL表达式,默认为false,表示不忽略,即支持EL表达式
page指令不常用的属性:
language:当前JSP编译后的语言!默认为java,当前也只能选择java
info:当前JSP的说明信息
isThreadSafe:当前JSP是否执行只能单线程访问,默认为false,表示支持并发访问
session:当前页面是否可以使用session,默认为false,表示支持session的使用。
extends:指定JSP编译的servlet的父类!
include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file=”文件相对 url 地址” %>
使用静态include指令
<%@include file=“scriptlet.jsp” %>
使用动态Include指令
<jsp:include page=“scriptlet.jsp” />
静态导入和动态导入的区别:
- 静态导入(include指令)通过file属性指定被包含的文件,并且file属性不支持任何表达式;动态导入(include动作)通过page属性指定被包含的文件,且page属性支持JSP表达式;
- 使用静态导入(include指令)时,被包含的文件内容会原封不动的插入到包含页中,然后JSP编译器再将合成后的文件最终编译成一个Java文件;使用动态导入(include动作)包含文件时,当该标识被执行时,程序会将请求转发(不是请求重定向)到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页继续执行后面的代码。因为服务器执行的是多个文件,所以JSP编译器会分别对这些文件进行编译;
- 使用include静态指令包含文件时,由于被包含的文件最终会生成一个文件,所以在被包含、包含文件中不能有重名的变量或方法;而include动态包含文件时,由于每个文件是单独编译的,所以在被包含文件和包含文件中重名的变量和方法是不相冲突的。
- 静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet,因此被导入页面甚至不需要是一个完整的页面;而动态导入则在Servlet中使用include方法来引入被导入页面的内容;
- 静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。
taglib指令
taglib指令是用来在当前jsp页面中导入第三方的标签库
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” % prefix=”c” >
prefix:指定标签前缀,这个东西可以随意起名
uri:指定第三方标签库的uri(唯一标识)
当然,需要先把第三方标签库所需jar包放到类路径中。
九大内置对象
在jsp中无需声明即可直接使用的9个对象
- out对象:用于向客户端、浏览器输出数据。
- request对象:封装了来自客户端、浏览器的各种信息。
- response对象:封装了服务器的响应信息。
- exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
- config对象:封装了应用程序的配置信息。
- page对象:指向了当前jsp程序本身。
- session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
- application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
- pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。
JSP九大内置对象分为四类:
输入输出对象:out对象、response对象、request对象
通信控制对象:pageContext对象、session对象、application对象
Servlet对象:page对象、config对象
错误处理对象:exception对象
1、request请求对象
隐藏对象request是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
request对象方法介绍:
方法名 | 说明 |
---|---|
isUserInRole | 判断认证后的用户是否属于某一成员组 |
getAttribute | 获取指定属性的值,如该属性值不存在返回Null |
getAttributeNames | 获取所有属性名的集合 |
getCookies | 获取所有Cookie对象 |
getCharacterEncoding | 获取请求的字符编码方式 |
getContentLength | 返回请求正文的长度,如不确定返回-1 |
getHeader | 获取指定名字报头值 |
getHeaders | 获取指定名字报头的所有值,一个枚举 |
getHeaderNames | 获取所有报头的名字,一个枚举 |
getInputStream | 返回请求输入流,获取请求中的数据 |
getMethod | 获取客户端向服务器端传送数据的方法 |
getParameter | 获取指定名字参数值 |
getParameterNames | 获取所有参数的名字,一个枚举 |
getParameterValues | 获取指定名字参数的所有值 |
getProtocol | 获取客户端向服务器端传送数据的协议名称 |
getQueryString | 获取以get方法向服务器传送的查询字符串 |
getRequestURI | 获取发出请求字符串的客户端地址 |
getRemoteAddr | 获取客户端的IP地址 |
getRemoteHost | 获取客户端的名字 |
getSession | 获取和请求相关的会话 |
getServerName | 获取服务器的名字 |
getServerPath | 获取客户端请求文件的路径 |
getServerPort | 获取服务器的端口号 |
removeAttribute | 删除请求中的一个属性 |
setAttribute | 设置指定名字参数值 |
2、response响应对象
隐藏对象response是javax.servlet.ServletResponse类的实例,代表客户端的响应,主要是将JSP容器处理过的对象传回到客户端。服务器端的任何输出都通过response对象发送到客户端浏览器。每次服务器端都会响应一个response实例。response对象也具有作用域,它只在JSP页面内有效。
response对象的常用方法如下:
方法名 | 说明 |
---|---|
String getCharacterEncoding() | 返回响应用的是何种字符编码 |
ServletOutputStream getOutputStream() | 返回响应的一个二进制输出流 |
PrintWriter getWriter() | 返回可以向客户端输出字符的一个对象 |
void setContentLength(int len) | 设置响应头长度 |
void setContentType(String type) | 设置响应的MIME类型 |
sendRedirect(java.lang.String location) | 重新定向客户端的请求 |
void setCharacterEncoding(“gb2312”) | 设置响应头的字符集 |
3、session会话对象
- session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
- 隐藏对象session是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制,session是用于服务器端保存用户信息,cookie用于在客户端保存用户信息。Servlet中通过request.getSession()来获取session对象,而JSP中可以直接使用。如果JSP中配置了<%@page session=”false”%>,则隐藏对象session不可用。每个用户对应一个session对象。
session对象的常用方法如下:
方法名 | 说明 |
---|---|
long getCreationTime() | 返回Session创建时间 |
public String getId() | 返回Session创建时JSP引擎为它设的唯一ID号 |
long getLastAccessedTime() | 返回此Session里客户端最近一次请求时间 |
int getMaxInactiveInterval() | 返回两次请求间隔多长时间此Session被取消(ms) |
String[] getValueNames() | 返回一个包含此Session中所有可用属性的数组 |
void invalidate() | 取消Session,使Session不可用 |
boolean isNew() | 返回服务器创建的一个Session,客户端是否已经加入 |
void removeValue(String name) | 删除Session中指定的属性 |
void setAttribute(String key,Object obj) | 设置Session的属性 |
Object getAttribute(String name) | 返回session中属性名为name的对象 |
cookie
- cookie是Web服务器保存在客户端的一系列文本信息,cookie不是内置对象。
- cookie的作用
- 对特定对象的追踪
- 统计网页浏览次数
- 简化登录- 安全性能
- 容易信息泄露
1、添加和读取cookie
1、创建cookie对象
Cookie newCookie = new Cookie(String key,Object value);
2、写入cookie
response.addCookie(newCookie);
3、读取cookie
Cookie[] cookies = request.getCookies();
2、cookie对象的常用方法
3、cookie与session的对比
4、application应用程序对象
- application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
- 隐藏对象application是javax.servlet.ServletContext类的对象。application封装JSP所在Web应用程序的信息,例如web.xml中国配置的全局的初始化信息。Servlet中application对象需要通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。
application对象常用的方法如下:
方法名 | 说明 |
---|---|
Object getAttribute(String name) | 返回application中属性为name的对象 |
Enumeration getAttributeNames() | 返回application中的所有属性名 |
void setAttribute(String name,Object value) | 设置application属性 |
void removeAttribute(String name) | 移除application属性 |
String getInitParameter(String name) | 返回全局初始话函数 |
Enumeration getInitParameterNames() | 返回所有的全局初始话参数 |
String getMimeType(String filename) | 返回文件的文档类型,例如getMimeType(“abc.html”)将返回“text.html” |
String getRealPath(String relativePath) | 返回Web应用程序内相对网址对应的绝对路径 |
5、out输出流对象
- out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
- 隐藏对象out是javax.servlet.jsp.JspWriter类的实例服务器向客户输出的字符内容可以通过out对象输出。获取方法: PrintWriter out = response.getWriter();
out对象常用的方法如下:
方法名 | 说明 |
---|---|
void clear() | 清除缓冲区的内容 |
void clearBuffer() | 清除缓冲区的当前内容 |
void flush() | 将缓冲内容flush到客户端浏览器 |
int getBufferSize() | 返回缓冲大小,单位KB |
int getRemaining() | 返回缓冲剩余大小,单位KB |
isAutoFlush() | 返回缓冲区满时,是自动清空还是抛出异常 |
void close() | 关闭输出流 |
6、pageContext页面上下文对象
隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
pageContext常用方法如下:
方法名 | 说明 |
---|---|
JspWriter getOut() | 返回out对象 |
HttpSession getSession() | 返回Session对象(session) |
Object getPage() | 返回page对象 |
ServletRequest getRequest() | 返回request对象 |
ServletResponse getResponse() | 返回response对象 |
void setAttribute(String name,Object attribute) | 设置属性及属性值 ,在page范围内有效 |
void setAttribute(String name,Object obj,int scope) | 在指定范围内设置属性及属性值 ,int1=page,2=request,3=session,4=application |
public Object getAttribute(String name) | 取属性的值 |
Object getAttribute(String name,int scope) | 在指定范围内取属性的值 |
public Object findAttribute(String name) | 寻找一属性,返回起属性值或NULL |
void removeAttribute(String name) | 删除某属性 |
void removeAttribute(String name,int scope) | 在指定范围删除某属性 |
int getAttributeScope(String name) | 返回某属性的作用范围 |
Enumeration getAttributeNamesInScope(int scope) | 返回指定范围内可用的属性名枚举 |
void release() | 释放pageContext所占用的资源 |
void forward(String relativeUrlPath) | 使当前页面重导到另一页面 |
void include(String relativeUrlPath) | 在当前位置包含另一文件 |
7、config配置对象
- config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
- 隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件中共有一个config对象。
config对象的常用方法如表:
方法名 | 说明 |
---|---|
String getInitParameter(String name) | 返回配置在web.xml中初始化参数 |
Enumeration getInitParameterNames() | 返回所有的初始化参数名称 |
ServletContext getServletContext() | 返回ServletContext对象 |
String getServletName | 返回Servlet对象 |
8、page页面对象
隐藏对象page是javax.servlet.jsp.HttpJspPage类的实例。page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、Eexception异常对象
隐藏对象exception为java.lang.Exception类的对象。exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
JSP之七大动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个 JavaBean。
jsp:setProperty:设置 JavaBean 的属性。
jsp:getProperty:输出某个 JavaBean 的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记
四大域对象
域作用范围
- page域(javax.servlet.jsp.PageContext(抽象类)): 只能在当前jsp页面使用 (当前页面)
- request域(javax.servlet.httpServletRequest): 只能在同一个请求中使用 (转发)
- session域(javax.servlet.http.HttpSession): 只能在同一个会话(session对象)中使用,仅供单个用户使用 (私有的)
- Application域(javax.servlet.ServletContext): 只能在同一个web应用中使用,全部用户共享 (全局的)
转发和重定向区别
页面跳转的两种实现方式:请求转发和重定向;
请求转发:
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
重定向:
客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)
请求转发:
request.getRequestDispatcher("/test.jsp").forword(request,response);
重定向:
response.sendRedirect("/test.jsp");
区别:
1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同:重定向是客户端行为,转发是服务器端行为;
使用:
1、可以利用request的域对象的特点,由源组件向其中存放写数据;
2、可以让用户访问到存放在WEB-INF目录中的目标资源;
3、重定向的速度比转发慢,因为浏览器还得发出一个新的请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发;
4、因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。
jsp与jdk的对应表
JSP | 基础 | 两种方式循环输出
实现九九乘法表
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
long startTime=System.nanoTime();
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
String str=j+"x"+i+"="+(i*j);
out.print(str+" ");
}
out.print("<br>");
}
long endTime=System.nanoTime()-startTime;
/* out.println(endTime); */
%>
生成九九乘法表,用时<% out.println(endTime/1000);%>毫秒
</body>
</html>
用循环连续输出三个你好,字体从小变大
第一种:
<body>
<%!
//通过表达式方式调用实现
String HelloJSP1(){
String str = "";
for(int i = 5; i >= 1; i--){
str += "<h" + i+">" +"你好~" +"<"+"/h"+i+">" ;
}
return str;
}
%>
<%=HelloJSP1() %>
</body>
第二种:
<body>
<%!
// JSP内置out对象 通过调用脚本方式实现
void HelloJSP2(JspWriter out) throws Exception {
for(int i = 5; i >= 1; i--){
out.println( "<h" + i+">" +"你好~" +"<"+"/h"+i+">" ) ;
}
}
%>
<%HelloJSP2(out); %>
</body>
阶段小项目:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
//通过表达式方式调用实现
String HelloJSP1(){
String str = "";
for(int i = 5; i >= 1; i--){
str += "<h" + i+">" +"你好~" +"<"+"/h"+i+">" ;
}
return str;
}
// JSP内置out对象 通过调用脚本方式实现
void HelloJSP2(JspWriter out) throws Exception {
for(int i = 5; i >= 1; i--){
out.println( "<h" + i+">" +"你好~" +"<"+"/h"+i+">" ) ;
}
}
%>
<%=HelloJSP1() %>
<hr>
<%HelloJSP2(out); %>
</body>
</html>