附录C Jetty与JettyUtils
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/77449938
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录C的内容都在本文呈现。
Jetty简介
Jetty是一个开源的,以Java作为开发语言的servlet容器。它的API以一组JAR包的形式发布。Jetty容器可以实例化成一个对象,因而迅速为一些独立运行的Java应用提供网络和web服务。要为Jetty创建servlet,就涉及ServletContextHandler的API使用。示例代码如下:
class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String msg = "Hello World!";
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>" + msg + "</h1>");
response.getWriter().println("session=" + request.getSession(true).getId());
}
}
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
server.setHandler(context);
// http://localhost:8080/hello
context.addServlet(new ServletHolder(new HelloServlet()), "/hello");
server.start();
server.join();
}
如果想更深入了解Jetty,请访问官网http://www.eclipse.org/jetty/JettyUtils
JettyUtils是Spark对于Jetty相关API的又一层封装,这里对其中一些主要类型和方法进行介绍。ServerInfo
功能描述:提供给Jetty服务器添加或移除ContextHandler,以及停止Jetty服务器的实现。
private[spark] case class ServerInfo(
server: Server,
boundPort: Int,
securePort: Option[Int],
private val rootHandler: ContextHandlerCollection) {
def addHandler(handler: ContextHandler): Unit = {
handler.setVirtualHosts(Array("@" + JettyUtils.SPARK_CONNECTOR_NAME))
rootHandler.addHandler(handler)
if (!handler.isStarted()) {
handler.start()
}
}
def removeHandler(handler: ContextHandler): Unit = {
rootHandler.removeHandler(handler)
if (handler.isStarted) {
handler.stop()
}
}
def stop(): Unit = {
server.stop()
// Stop the ThreadPool if it supports stop() method (through LifeCycle).
// It is needed because stopping the Server won't stop the ThreadPool it uses.
val threadPool = server.getThreadPool
if (threadPool != null && threadPool.isInstanceOf[LifeCycle]) {
threadPool.asInstanceOf[LifeCycle].stop
}
}
}
createServlet功能描述:创建javax.servlet.http.HttpServlet的匿名内部类实例。此实例处理请求实际是使用servletParams的responder:Responder,此Responder类型发生隐式转换,会转换为用户传入的函数参数。 def createServlet[T <% AnyRef](
servletParams: ServletParams[T],
securityMgr: SecurityManager,
conf: SparkConf): HttpServlet = {
val allowFramingFrom = conf.getOption("spark.ui.allowFramingFrom")
val xFrameOptionsValue =
allowFramingFrom.map(uri => s"ALLOW-FROM $uri").getOrElse("SAMEORIGIN")
new HttpServlet {
override def doGet(request: HttpServletRequest, response: HttpServletResponse) {
try {
if (securityMgr.checkUIViewPermissions(request.getRemoteUser)) {
response.setContentType("%s;charset=utf-8".format(servletParams.contentType))
response.setStatus(HttpServletResponse.SC_OK)
val result = servletParams.responder(request)
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
response.setHeader("X-Frame-Options", xFrameOptionsValue)
response.getWriter.print(servletParams.extractFn(result))
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
"User is not authorized to access this page.")
}
} catch {
case e: IllegalArgumentException =>
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage)
case e: Exception =>
logWarning(s"GET ${request.getRequestURI} failed: $e", e)
throw e
}
}
// SPARK-5983 ensure TRACE is not supported
protected override def doTrace(req: HttpServletRequest, res: HttpServletResponse): Unit = {
res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED)
}
}
}
createServletHandler
功能描述:创建以给定路径为前缀的请求的ServletContextHandler。处理步骤如下:
1) 调用createServlet,生成javax.servlet.http.HttpServlet的匿名内部类实例。此实例处理请求实际是使用servletParams的responder:Responder,此Responder类型发生隐式转换,会转换为用户传入的函数参数。
2)调用重载的createServletHandler方法,生成org.eclipse.jetty.servlet.ServletHolder ,并最终生成ServletContextHandler。createServletHandler的实现如下。 def createServletHandler[T <% AnyRef](
path: String,
servletParams: ServletParams[T],
securityMgr: SecurityManager,
conf: SparkConf,
basePath: String = ""): ServletContextHandler = {
createServletHandler(path, createServlet(servletParams, securityMgr, conf), basePath)
}
/** Create a context handler that responds to a request with the given path prefix */
def createServletHandler(
path: String,
servlet: HttpServlet,
basePath: String): ServletContextHandler = {
val prefixedPath = if (basePath == "" && path == "/") {
path
} else {
(basePath + path).stripSuffix("/")
}
val contextHandler = new ServletContextHandler
val holder = new ServletHolder(servlet)
contextHandler.setContextPath(prefixedPath)
contextHandler.addServlet(holder, "/")
contextHandler
}
createStaticHandler功能描述:创建对静态目录提供文件服务的ServletContextHandler。 def createStaticHandler(resourceBase: String, path: String): ServletContextHandler = {
val contextHandler = new ServletContextHandler
contextHandler.setInitParameter("org.eclipse.jetty.servlet.Default.gzip", "false")
val staticHandler = new DefaultServlet
val holder = new ServletHolder(staticHandler)
Option(Utils.getSparkClassLoader.getResource(resourceBase)) match {
case Some(res) =>
holder.setInitParameter("resourceBase", res.toString)
case None =>
throw new Exception("Could not find resource path for Web UI: " + resourceBase)
}
contextHandler.setContextPath(path)
contextHandler.addServlet(holder, "/")
contextHandler
}
createRedirectHandler功能描述:创建将用户对源路径的请求总是重定向到目标路径的ServletContextHandler。 def createRedirectHandler(
srcPath: String,
destPath: String,
beforeRedirect: HttpServletRequest => Unit = x => (),
basePath: String = "",
httpMethods: Set[String] = Set("GET")): ServletContextHandler = {
val prefixedDestPath = basePath + destPath
val servlet = new HttpServlet {
override def doGet(request: HttpServletRequest, response: HttpServletResponse): Unit = {
if (httpMethods.contains("GET")) {
doRequest(request, response)
} else {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED)
}
}
override def doPost(request: HttpServletRequest, response: HttpServletResponse): Unit = {
if (httpMethods.contains("POST")) {
doRequest(request, response)
} else {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED)
}
}
private def doRequest(request: HttpServletRequest, response: HttpServletResponse): Unit = {
beforeRedirect(request)
// Make sure we don't end up with "//" in the middle
val newUrl = new URL(new URL(request.getRequestURL.toString), prefixedDestPath).toString
response.sendRedirect(newUrl)
}
// SPARK-5983 ensure TRACE is not supported
protected override def doTrace(req: HttpServletRequest, res: HttpServletResponse): Unit = {
res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED)
}
}
createServletHandler(srcPath, servlet, basePath)
}
startJettyServer
功能描述:创建以给定路径为前缀的请求的响应处理。处理步骤如下:
1) 将SparkUI中的全部handler加入ContextHandlerCollection。
2) 如果使用配置spark.ui.filters指定了filter,则给所有handler增加filter。
3) 调用Utils的方法startServiceOnPort,最终回调函数connect。startJettyServer的实现如下。 def startJettyServer(
hostName: String,
port: Int,
sslOptions: SSLOptions,
handlers: Seq[ServletContextHandler],
conf: SparkConf,
serverName: String = ""): ServerInfo = {
addFilters(handlers, conf)
val gzipHandlers = handlers.map { h =>
h.setVirtualHosts(Array("@" + SPARK_CONNECTOR_NAME))
val gzipHandler = new GzipHandler
gzipHandler.setHandler(h)
gzipHandler
}
// Bind to the given port, or throw a java.net.BindException if the port is occupied
def connect(currentPort: Int): ((Server, Option[Int]), Int) = {
val pool = new QueuedThreadPool
if (serverName.nonEmpty) {
pool.setName(serverName)
}
pool.setDaemon(true)
val server = new Server(pool)
val connectors = new ArrayBuffer[ServerConnector]()
val collection = new ContextHandlerCollection
// Create a connector on port currentPort to listen for HTTP requests
val httpConnector = new ServerConnector(
server,
null,
// Call this full constructor to set this, which forces daemon threads:
new ScheduledExecutorScheduler(s"$serverName-JettyScheduler", true),
null,
-1,
-1,
new HttpConnectionFactory())
httpConnector.setPort(currentPort)
connectors += httpConnector
val httpsConnector = sslOptions.createJettySslContextFactory() match {
case Some(factory) =>
// If the new port wraps around, do not try a privileged port.
val securePort =
if (currentPort != 0) {
(currentPort + 400 - 1024) % (65536 - 1024) + 1024
} else {
0
}
val scheme = "https"
// Create a connector on port securePort to listen for HTTPS requests
val connector = new ServerConnector(server, factory)
connector.setPort(securePort)
connector.setName(SPARK_CONNECTOR_NAME)
connectors += connector
// redirect the HTTP requests to HTTPS port
httpConnector.setName(REDIRECT_CONNECTOR_NAME)
collection.addHandler(createRedirectHttpsHandler(securePort, scheme))
Some(connector)
case None =>
// No SSL, so the HTTP connector becomes the official one where all contexts bind.
httpConnector.setName(SPARK_CONNECTOR_NAME)
None
}
// As each acceptor and each selector will use one thread, the number of threads should at
// least be the number of acceptors and selectors plus 1. (See SPARK-13776)
var minThreads = 1
connectors.foreach { connector =>
// Currently we only use "SelectChannelConnector"
// Limit the max acceptor number to 8 so that we don't waste a lot of threads
connector.setAcceptQueueSize(math.min(connector.getAcceptors, 8))
connector.setHost(hostName)
// The number of selectors always equals to the number of acceptors
minThreads += connector.getAcceptors * 2
}
pool.setMaxThreads(math.max(pool.getMaxThreads, minThreads))
val errorHandler = new ErrorHandler()
errorHandler.setShowStacks(true)
errorHandler.setServer(server)
server.addBean(errorHandler)
gzipHandlers.foreach(collection.addHandler)
server.setHandler(collection)
server.setConnectors(connectors.toArray)
try {
server.start()
((server, httpsConnector.map(_.getLocalPort())), httpConnector.getLocalPort)
} catch {
case e: Exception =>
server.stop()
pool.stop()
throw e
}
}
val ((server, securePort), boundPort) = Utils.startServiceOnPort(port, connect, conf,
serverName)
ServerInfo(server, boundPort, securePort,
server.getHandler().asInstanceOf[ContextHandlerCollection])
}
关于《Spark内核设计的艺术 架构设计与实现》经过近一年的准备,《Spark内核设计的艺术 架构设计与实现》一书现已出版发行,图书如图:
纸质版售卖链接如下:
京东:https://item.jd.com/12302500.html
电子版售卖链接如下:
京东:https://e.jd.com/30389208.html
Spring系列(十二):AOP相关知识笔记
目录1、AOP定义2、AOP的用途3、AOP常用的注解4、AOP实现Web统一日志Demo4.1 新建IErrorCode.java 接口类4.2 新建ResultCode.java 接口类4.3 新建WebLog.java4.4 新建WebLogAspect.java 类4.5 新建测试控制器TestLogController.java今天给大家分享AOP相关的知识,希望对大家能有所帮助!1、AOP定义AOP全称为Aspect Oriented Programming,中文含义为:面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的技术。AOP技术是Spring框架中的一个重要内容。使用AOP技术可以对业务逻辑的各个部分进行隔离,可以使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发的效率。2、AOP的用途使用AOP技术可以很好的将日志记录,性能统计,安全控制,事务处理,异常处理、Web参数校验等代码逻辑从业务代码中分离出来,让开发人员只需要关注业务代码的编写,从而开发效率,节省开发成本。3、AOP常用的注解 注解
注解说明
@Aspect
切面声明:通常标注在类、接口(包括注解类型)或枚举上。
@Pointcut
切入点声明:即切入到哪些目标类的目标方法。 value 属性指定切入点表达式,默认为 “”,用于被通知注解引用,这样通知注解只需要关联此切入点声明即可,无需再重复写切入点表达式
@Before
前置通知: 在目标方法(切入点)执行之前执行。value 属性绑定通知的切入点表达式,可以关联切入点声明,也可以直接设置切入点表达式 注意:如果在此回调方法中抛出异常,则目标方法不会再执行,会继续执行后置通知 -> 异常通知。
@After
后置通知,:在目标方法(切入点)执行之后执行
@AfterRunning
返回通知,:在目标方法(切入点)返回结果之后执行,在 @After 的后面执行pointcut 属性绑定通知的切入点表达式,优先级高于 value,默认为 “”
@AfterThrowing
异常通知,:在方法抛出异常之后执行, 意味着跳过返回通知pointcut 属性绑定通知的切入点表达式,优先级高于 value,默认为 “” 说明:如果目标方法自己 try-catch 了异常,而没有继续往外抛,则不会进入此回调函数
@Around
环绕通知:目标方法执行前后分别执行一些代码,发生异常的时候执行另外一些代码
4、AOP实现Web统一日志Demo4.1 新建IErrorCode.java 接口类package com.aop.common.api;
/**
* 封装API的错误码
*/
public interface IErrorCode {
long getCode();
String getMessage();
}4.2 新建ResultCode.java 接口类package com.aop.common.api;
/**
* 枚举了一些常用API操作码
*/
public enum ResultCode implements IErrorCode {
SUCCESS(200, "操作成功"),
FAILED(500, "操作失败"),
VALIDATE_FAILED(404, "参数检验失败"),
UNAUTHORIZED(401, "暂未登录或token已经过期"),
FORBIDDEN(403, "没有相关权限");
private long code;
private String message;
private ResultCode(long code, String message) {
this.code = code;
this.message = message;
}
public long getCode() {
return code;
}
public String getMessage() {
return message;
}
}4.3 新建WebLog.javapackage com.aop.common.dto;
/**
* Controller层的日志封装类
*/
public class WebLog {
/**
* 操作描述
*/
private String description;
/**
* 操作用户
*/
private String username;
/**
* 操作时间
*/
private Long startTime;
/**
* 消耗时间
*/
private Integer spendTime;
/**
* 根路径
*/
private String basePath;
/**
* URI
*/
private String uri;
/**
* URL
*/
private String url;
/**
* 请求类型
*/
private String method;
/**
* IP地址
*/
private String ip;
/**
* 请求参数
*/
private Object parameter;
/**
* 请求返回的结果
*/
private Object result;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Long getStartTime() {
return startTime;
}
public void setStartTime(Long startTime) {
this.startTime = startTime;
}
public Integer getSpendTime() {
return spendTime;
}
public void setSpendTime(Integer spendTime) {
this.spendTime = spendTime;
}
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Object getParameter() {
return parameter;
}
public void setParameter(Object parameter) {
this.parameter = parameter;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}4.4 新建WebLogAspect.java 类package com.aop.common.component;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONUtil;
import com.aop.common.dto.WebLog;
import io.swagger.annotations.ApiOperation;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 统一日志处理切面
*/
@Aspect
@Component
@Order(1)
public class WebLogAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(WebLogAspect.class);
//切点定义了通知功能被应用的范围。比如日志切面的应用范围就是所有接口,即所有controller层的接口方
@Pointcut("execution(public * com.macro.mall.tiny.controller.*.*(..))")
public void webLog() {
}
// 在目标方法调用前调用通知功能
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
}
// 在目标方法成功执行之后调用通知功能
@AfterReturning(value = "webLog()", returning = "ret")
public void doAfterReturning(Object ret) throws Throwable {
}
// 通知包裹了目标方法,在目标方法调用之前和之后执行自定义的行为
@Around("webLog()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
//获取当前请求对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//记录请求信息
WebLog webLog = new WebLog();
Object result = joinPoint.proceed();
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method.isAnnotationPresent(ApiOperation.class)) {
ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
webLog.setDescription(apiOperation.value());
}
long endTime = System.currentTimeMillis();
String urlStr = request.getRequestURL().toString();
webLog.setBasePath(StrUtil.removeSuffix(urlStr, URLUtil.url(urlStr).getPath()));
webLog.setIp(request.getRemoteUser());
webLog.setMethod(request.getMethod());
webLog.setParameter(getParameter(method, joinPoint.getArgs()));
webLog.setResult(result);
webLog.setSpendTime((int) (endTime - startTime));
webLog.setStartTime(startTime);
webLog.setUri(request.getRequestURI());
webLog.setUrl(request.getRequestURL().toString());
LOGGER.info("{}", JSONUtil.parse(webLog));
return result;
}
/**
* 根据方法和传入的参数获取请求参数
*/
private Object getParameter(Method method, Object[] args) {
List<Object> argList = new ArrayList<>();
Parameter[] parameters = method.getParameters();
for (int i = 0; i < parameters.length; i++) {
//将RequestBody注解修饰的参数作为请求参数
RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
if (requestBody != null) {
argList.add(args[i]);
}
//将RequestParam注解修饰的参数作为请求参数
RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);
if (requestParam != null) {
Map<String, Object> map = new HashMap<>();
String key = parameters[i].getName();
if (!StringUtils.isEmpty(requestParam.value())) {
key = requestParam.value();
}
map.put(key, args[i]);
argList.add(map);
}
}
if (argList.size() == 0) {
return null;
} else if (argList.size() == 1) {
return argList.get(0);
} else {
return argList;
}
}
}4.5 新建测试控制器TestLogController.javapackage com.aop.common.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/TestLog")
public class TestLogController {
@RequestMapping("/Test")
public String Test(String name)
{
return "hello"+name;
}
}请求参数:localhost:8080/TestLog/Test?name=121输出结果:{"result":"hello121","basePath":"http://localhost:8080","method":"GET","startTime":1645883742030,"uri":"/TestLog/Test","url":"http://localhost:8080/TestLog/Test","spendTime":4695}
JSP 九大内置对象
① out - javax.servlet.jsp.jspWriter
out对象用于把结果输出到网页上。
方法:
1. void clear() ;
清除输出缓冲区的内容,但是不输出到客户端。
2. void clearBuffer() ;
清除输出缓冲区的内容,并输出到客户端。
3. void close() ;
关闭输出流,清除所有内容。
4. void flush() ;
输出缓冲区里面的数据。
5. int getBufferSize() ;
获取以kb为单位的目前缓冲区大小。
6. int getRemaining() ;
获取以kb为单位的缓冲区中未被占用的空间大小。
7. boolean isAutoFlush() ;
是否自动刷新缓冲区。
8. void newLine() ;
输出一个换行字符。
9. void print( boolean b ) ;
void print( char c ) ;
void print( char[] s ) ;
void print( double d ) ;
void print( float f ) ;
void print( int i ) ;
void print( long l ) ;
void print( Object obj ) ;
void print( String s ) ;
将指定类型的数据输出到Http流,不换行。
10. void println( boolean b ) ;
void println( char c ) ;
void println( char[] s ) ;
void println( double d ) ;
void println( float f ) ;
void println( int i ) ;
void println( long l ) ;
void println( Object obj ) ;
void println( String s ) ;
将指定类型的数据输出到Http流,并输出一个换行符。
11. Appendable append( char c ) ;
Appendable append( CharSequence cxq, int start, int end ) ;
Appendable append( CharSequence cxq ) ;
将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。
成员:
int DEFAULT_BUFFER = 0 - 缺省缓冲区大小
int NO_BUFFER = -1 - writer是否处于缓冲输出状态
int UNBOUNDED_BUFFER = -2 - 是否限制缓冲区大小
② request - javax.servlet.http.HttpServletRequest
request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。
方法:
1. Object getAttribute( String name ) ;
返回由name指定的属性值,该属性不存在时返回null。
2. Enumeration getAttributeNames() ;
返回request对象的所有属性名称的集合。
3. String getAuthType() ;
返回用来保护servlet的认证方法的名称,未受保护时返回null。
4. String getCharacterEncoding() ;
返回请求中的字符编码方法,可以在response对象中设置。
5. int getContentLength() ;
返回请求的BODY的长度,不能确定长度时返回-1。可以在response中设置。
6. String getContentType() ;
返回在response中定义的内容类型。
7. String getContentPath() ;
返回请求的路径。
8. Cookie[] getCookies() ;
返回客户端所有的Cookie的数组。
9. Enumeration getHeaderNames() ;
返回所有HTTP头的名称的集合。
10. Enumeration getHeaders( String name ) ;
返回指定HTTP头的所有值的集合。
11. String getHeader( String name ) ;
返回指定名称的HTTP头的信息。
12. long getDateHeader( String name ) ;
返回指定名称的Data类型的HTTP头的信息。
13. int getIntHeader( String name ) ;
返回指定名称的Int类型的HTTP头的信息。
14. ServletInputStream getInputStream() ;
返回请求的输入流。
15. Locale getLocale() ;
返回当前页的Locale对象,可以在response中设定。
16. Enumeration getLocales() ;
返回请求中所有的Locale对象的集合。
17. String getLocalName() ;
获取响应请求的服务器端主机名。
18. String getLocalAddr() ;
获取响应请求的服务器端地址。
19. int getLocalPort() ;
获取响应请求的服务器端端口
20. String getMethod() ;
获取客户端向服务器端发送请求的方法(GET、POST)。
21. String getParameter( String name ) ;
获取客户端发送给服务器端的参数值。
22. Map getParameterMap() ;
该方法返回包含请求中所有参数的一个Map对象。
23. Enumeration getParameterNames() ;
返回请求中所有参数的集合。
24. String[] getParameterValues( String name ) ;
获得请求中指定参数的所有值。
25. String getQueryString() ;
返回get方法传递的参数字符串,该方法不分解出单独的参数。
26. String getPathInfo() ;
取出请求中处于ServletPath和QueryString之间的额外信息。
27. String getPathTranslated() ;
返回用getPathInfo()方法取得的路径信息的实际路径。
28. String getProtocol() ;
返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。
29. BufferedReader getReader() ;
返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。
30. String getRemoteAddr() ;
获取发出请求的客户端IP地址。
31. String getRemoteHost() ;
获取发出请求的客户端主机名
32. String getRemoteUser() ;
返回经过客户端验证的用户名,未经验证返回null。
33. int getRemotePort() ;
返回发出请求的客户端主机端口。
34. String getRealPath( String path ) ;
返回给定虚拟路径的物理路径。
35. RequestDispatcher getRequestDispatcher( String path ) ;
按给定的路径生成资源转向处理适配器对象。
36. String getRequestedSessionId() ;
返回请求的session的标识。
37. String RequestURI() ;
返回发出请求的客户端地址,但是不包括请求的参数字符串。
38. StringBuffer getRequestURI() ;
返回响应请求的服务器端地址
39. String getScheme() ;
获取协议名称,缺省值为HTTP协议。
40. String getServerName() ;
返回响应请求的服务器名称。
41. String getServletPath() ;
获取客户端所请求的脚本文件的文件路径。
42. int getServerPort() ;
获取响应请求的服务器端主机端口号。
43. void removeAttribute( String name ) ;
在属性列表中删除指定名称的属性。
44. void setAttribute( String name, Object value ) ;
在属性列表中添加/删除指定的属性。
45. void setCharacterEncoding( String name ) ;
设置请求的字符编码格式。
46. HttpSession getSession() ;
HttpSession getSession( boolean create ) ;
获取session,如果create为true,在无session的情况下创建一个。
47. boolean isRequestedSessionIdFromCookie() ;
检查请求的会话ID是否为通过Cookie传入。
48. boolean isRequestedSessionIdFromURL() ;
检查请求的会话ID是否为通过URL传入。
49. boolean isRequestedSessionIdValid() ;
检查请求的会话ID是否仍然有效。
50. boolean isSecure() ;
检查请求是否使用安全链接,如果HTTPS等。
51. boolean isUserInRole( String role ) ;
检查已经通过验证的用户是否在是role所指定的角色。
52. Principal getUserPrincipal() ;
返回包含用户登陆名的一个java.security.Principal对象。
成员:
String BASIC_AUTH = "BASIC" -
String CLIENT_CERT_AUTH = "CLIENT_CERT" -
String DIGEST_AUTH = "DIGEST" -
String FORM_AUTH = "FORM" -
③ response - javax.servlet.http.HttpServletResponse
response对象主要将JSP容器处理后的结果传回到客户端。
方法:
1. void addCookie( Cookie cookie ) ;
添加一个Cookie对象,保存客户端信息。
2. void addDateHeader( String name, long value ) ;
添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息。
3. void addHeader( String name, String value ) ;
添加一个HTTP头,覆盖同名的旧HTTP头。
4. void addIntHeader( String name, int value ) ;
添加一个整型的HTTP头,覆盖同名的旧HTTP头。
5. boolean containsHeader( String name ) ;
判断指定的HTTP头是否存在。
6. String encodeRedirectURL( String url ) ;
对sendRedirect()方法使用的URL进行编码。
7. String encodeURL( String url ) ;
将URL予以编码,回传包含session ID的URL。
8. void flushBuffer() ;
强制把当前缓冲区的内容发送到客户端。
9. int getBufferSize() ;
取得以kb为单位的缓冲区大小。
10. String getCharacterEncoding() ;
获取响应的字符编码格式。
11. String getContentType() ;
获取响应的类型。
12. Locale getLocale() ;
获取响应的Locale对象。
13. ServletOutputStream getOutputStream() ;
返回客户端的输出流对象。
14. PrintWriter getWriter() ;
获取输出流对应的writer对象。
15. boolean isCommitted() ;
判断服务器端是否已经将数据输出到客户端。
16. void reset() ;
清空buffer中的所有内容。
17. void resetBuffer() ;
情况buffer中所有的内容,但是保留HTTP头和状态信息。
18. void sendError( int xc, String msg ) ;
void sendError( int xc ) ;
发送错误,包括状态码和错误信息。
19. void sendRedirect( String locationg ) ;
把响应发送到另外一个位置进行处理。
20. void setBufferSize( int size ) ;
设置以kb为单位的缓冲区大小。
21. void setCharacterEncoding( String charset ) ;
设置响应使用的字符编码格式。
22. void setContentLength( int length ) ;
设置响应的BODY长度。
23. void setContentType( String type ) ;
设置响应的类型。
24. void setDateHeader( String name, long value ) ;
设置指定名称的Data类型的HTTP头的值。
25. void setHeader( String name, String value ) ;
设置指定名称的HTTP头的值。
26. void setIntHeader( String name, int value ) ;
设置指定名称的int类型的HTTP头的值。
27. void setStatus( int xc ) ;
设置响应状态码,新值会覆盖当前值。
成员(HTTP状态码):
int SC_CONTINUE = 100 int SC_SWITCHING_PROTOCOLS = 101
int SC_OK = 200 int SC_NON_AUTHORITATIVE_INFORMATION = 203
int SC_ACCEPTED = 202 int SC_CREATED = 201
int SC_NO_CONTENT = 204 int SC_RESET_CONTENT = 205
int SC_PARTIAL_CONTENT = 206 int SC_MULTIPLE_CHOICES = 300
int SC_MOVED_PERMANENTLY = 301 int SC_MOVED_TEMPORARILY = 302
int SC_FOUND = 302 int SC_SEE_OTHER = 303
int SC_NOT_MODIFIED = 304 int SC_USE_PROXY = 305
int SC_TEMPORARY_REDIRECT = 307 int SC_BAD_REQUEST = 400
int SC_UNAUTHORIZED = 401 int SC_PAYMENT_REQUIRED = 402
int SC_FORBIDDEN = 403 int SC_NOT_FOUND = 404
int SC_METHOD_NOT_ALLOWED = 405 int SC_NOT_ACCEPTABLE = 406
int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408
int SC_CONFLICT = 409 int SC_GONE = 410
int SC_LENGTH_REQUIRED = 411 int SC_PRECONDITION_FAILED = 412
int SC_REQUEST_ENTITY_TOO_LARGE = 413 int SC_REQUEST_URI_TOO_LONG = 414
int SC_UNSUPPORTED_MEDIA_TYPE = 415 int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416
int SC_EXPECTATION_FAILED = 417 int SC_INTERNAL_SERVER_ERROR = 500
int SC_NOT_IMPLEMENTED = 501 int SC_BAD_GATEWAY = 502
int SC_SERVICE_UNAVAILABLE = 503 int SC_GATEWAY_TIMEOUT = 504
int SC_HTTP_VERSION_NOT_SUPPORTED = 505
④ session - javax.servlet.http.HttpSession
session对象表示目前个别用户的会话状态,用来识别每个用户。
方法:
1. Object getAttribute( String name ) ;
获取与指定名字相关联的session属性值。
2. Enumeration getAttributeNames() ;
取得session内所有属性的集合。
3. long getCreationTime() ;
返回session的创建时间,最小单位千分之一秒。
4. String getId() ;
取得session标识。
5. long getLastAccessedTime() ;
返回与当前session相关的客户端最后一次访问的时间,由1970-01-01算起,单位毫秒。
6. int getMaxInactiveInterval( int interval ) ;
返回总时间,以秒为单位,表示session的有效时间(session不活动时间)。-1为永不过期。
7. ServletContext getServletContext() ;
返回一个该JSP页面对应的ServletContext对象实例。
8. HttpSessionContext getSessionContext() ;
9. Object getValue( String name ) ;
取得指定名称的session变量值,不推荐使用。
10. String[] getValueNames() ;
取得所有session变量的名称的集合,不推荐使用。
11. void invalidate() ;
销毁这个session对象。
12. boolean isNew() ;
判断一个session是否由服务器产生,但是客户端并没有使用。
13. void pubValue( String name, Object value ) ;
添加一个session变量,不推荐使用。
14. void removeValue( String name ) ;
移除一个session变量的值,不推荐使用。
15. void setAttribute( String name, String value ) ;
设置指定名称的session属性值。
16. void setMaxInactiveInterval( int interval ) ;
设置session的有效期。
17. void removeAttribute( String name ) ;
移除指定名称的session属性。
⑤ pageContext - javax.servlet.jsp.PageContext
pageContext对象存储本JSP页面相关信息,如属性、内建对象等。
方法:
1. void setAttribute( String name, Object value, int scope ) ;
void setAttribute( String name, Object value ) ;
在指定的共享范围内设置属性。
2. Object getAttribute( String name, int scope ) ;
Object getAttribute( String name ) ;
取得指定共享范围内以name为名字的属性值。
3. Object findAttribute( String name ) ;
按页面、请求、会话和应用程序共享范围搜索已命名的属性。
4. void removeAttribute( String name, int scope ) ;
void removeAttribute( String name ) ;
移除指定名称和共享范围的属性。
5. void forward( String url ) ;
将页面导航到指定的URL。
6. Enumeration getAttributeNamesScope( int scope ) ;
取得指定共享范围内的所有属性名称的集合。
7. int getAttributeScope( String name ) ;
取得指定属性的共享范围。
8. ErrorData getErrorDate() ;
取得页面的errorData对象。
9. Exception getException() ;
取得页面的exception对象。
10. ExpressionEvaluator getExpressionEvaluator() ;
取得页面的expressionEvaluator对象。
11. JspWriter getOut() ;
取得页面的out对象。
12. Object getPage() ;
取得页面的page对象。
13. ServletRequest getRequest() ;
取得页面的request对象。
14. ServletResponse getResponse() ;
取得页面的response对象。
15. ServletConfig getConfig() ;
取得页面的config对象。
16. ServletContext getServletContext() ;
取得页面的servletContext对象。
17. HttpSession getSession() ;
取得页面的session对象。
18. VariableResolver getVariableResolver() ;
取得页面的variableResolver对象。
19. void include( String url, boolean flush ) ;
void include( String url ) ;
包含其他的资源,并指定是否自动刷新。
20. void release() ;
重置pageContext内部状态,释放所有内部引用。
21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,
String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;
初始化未经初始化的pageContext对象。
22. BodyContext pushBody() ;
BodyContext pushBody( Writer writer ) ;
保存当前的out对象,并更新pageContext中page范围内的out对象。
23. JspWrite popBody() ;
取出由pushBody()方法保存的out对象。
24. void handlePageException( Exception e ) ;
void handlePageException( Thrwoable t ) ;
成员:
int PAGE_SCOPE = 1 - 页面共享范围
int REQUEST_SCOPE = 2 - 请求共享范围
int SESSION_SCOPE = 3 - 会话共享范围
int APPLICATION_SCOPE = 4 - 应用程序共享范围
String PAGE = "javax.servlet.jsp.jspPage"
String PAGECONTEXT = "javax.servlet.jsp.jspPageContext"
String REQUEST = "javax.servlet.jsp.jspRequest"
String RESPONSE = "javax.servlet.jsp.jspResponse"
String CONFIG = "javax.servlet.jsp.jspConfig"
String SESSION = "javax.servlet.jsp.jspSession"
String OUT = "javax.servlet.jsp.jspOut"
String APPLICATION = "javax.servlet.jsp.jspApplication"
String EXCEPTION = "javax.servlet.jsp.jspException"
⑥ application - javax.servlet.ServletContext
application主要功用在于取得或更改Servlet的设定。
方法:
1. Object getAttribute( String name ) ;
返回由name指定的application属性。
2. Enumeration getAttributes() ;
返回所有的application属性。
3. ServletContext getContext( String uripath ) ;
取得当前应用的ServletContext对象。
4. String getInitParameter( String name ) ;
返回由name指定的application属性的初始值。
5. Enumeration getInitParameters() ;
返回所有的application属性的初始值的集合。
6. int getMajorVersion() ;
返回servlet容器支持的Servlet API的版本号。
7. String getMimeType( String file ) ;
返回指定文件的类型,未知类型返回null。一般为"text/html"和"image/gif"。
8. int getMinorVersion() ;
返回servlet容器支持的Servlet API的副版本号。
9. String getRealPath( String path ) ;
返回给定虚拟路径所对应物理路径。
10. RequestDispatcher getNamedDispatcher( String name ) ;
为指定名字的Servlet对象返回一个RequestDispatcher对象的实例。
11. RequestDispatcher getRequestDispatcher( String path ) ;
返回一个RequestDispatcher对象的实例。
12. URL getResource( String path ) ;
返回指定的资源路径对应的一个URL对象实例,参数要以"/"开头。
13. InputStream getResourceAsStream( String path ) ;
返回一个由path指定位置的资源的InputStream对象实例。
14. Set getResourcePaths( String path ) ;
返回存储在web-app中所有资源路径的集合。
15. String getServerInfo() ;
取得应用服务器版本信息。
16. Servlet getServlet( String name ) ;
在ServletContext中检索指定名称的servlet。
17. Enumeration getServlets() ;
返回ServletContext中所有servlet的集合。
18. String getServletContextName() ;
返回本web应用的名称。
19. Enumeration getServletContextNames() ;
返回ServletContext中所有servlet的名称集合。
20. void log( Exception ex, String msg ) ;
void log( String msg, Throwable t ) ;
void log( String msg ) ;
把指定的信息写入servlet log文件。
21. void removeAttribute( String name ) ;
移除指定名称的application属性。
22. void setAttribute( String name, Object value ) ;
设定指定的application属性的值。
⑦ config - javax.servlet.ServletConfig
config对象用来存放Servlet初始的数据结构。
方法:
1. String getInitParameter( String name ) ;
返回名称为name的促使参数的值。
2. Enumeration getInitParameters() ;
返回这个JSP所有的促使参数的名称集合。
3. ServletContext getContext() ;
返回执行者的servlet上下文。
4. String getServletName() ;
返回servlet的名称。
⑧ exception - java.lang.Throwable
错误对象,只有在JSP页面的page指令中指定isErrorPage="true"后,才可以在本页面使用exception对象。
方法:
1. Throwable fillInStackTrace() ;
将当前stack信息记录到exception对象中。
2. String getLocalizedMessage() ;
取得本地语系的错误提示信息。
3. String getMessage()
取得错误提示信息。
4. StackTrackElement[] getStackTrace() ;
返回对象中记录的call stack track信息。
5. Throwable initCause( Throwable cause ) ;
将另外一个异常对象嵌套进当前异常对象中。
6. Throwable getCause() ;
取出嵌套在当前异常对象中的异常。
7. void printStackTrace() ;
void printStackTrace( printStream s ) ;
void printStackTrace( printWriter s ) ;
打印出Throwable及其call stack trace信息。
8. void setStackTrace( StackTraceElement[] stackTrace )
设置对象的call stack trace信息。
⑨ page - javax.servlet.jsp.HttpJspPage
page对象代表JSP对象本身,或者说代表编译后的servlet对象,
可以用( (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性。
JDBC+Servlet+JSP整合开发之26.JSP内建对象
–使用内建对象的目的
–内建对象
–out 内建对象
–request 内建对象
–response 对象
–session 内建对象
–pageContext 内建对象
–application 内建对象
–config 内建对象
–page 内建对象
–exception 内建对象
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
? 使用内建对象的目的 –JSP 为了简化页面的开发提供了一些内建对象
–这些内建对象在使用之前不需要实例化
–它们由容器(如:Tomcat)来实现和管理
–在所有的JSP页面中都能使用内建对象
–所有的的内建对象只能在代码块和表达式中使用
–不能在JSP声明中使用
? 内建对象 –request
TestJspServlet.java
package com.michael.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestJspServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public TestJspServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", "michael");
request.getRequestDispatcher("/RequestJsp.jsp").forward(request, response);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}
}
RequestJsp.jsp
测试request是否被封装成HttpServletRequest接口
–response
–pageContext
–session
TestJspServlet.java
RequestJsp.jsp
测试
下面测试request和session的作用域
RequestJsp2.jsp
看下效果:
发现session作用域针对当前页面,age为20,而request针对当前请求,请求结束就终止了,name为null。
TestJspServlet.java
RequestJsp.jsp
看下效果:
–application
看下效果:
测试其作用域
现在只有application有值,其他都为空哈~
–out
–config
–page
–exception
? out 内建对象
–作用
? out 对象被封装成 javax.servlet.jsp.JspWriter接口
? 表示为客户端打开的输出流
? PrintWriter使用它向客户端发送输出流
–主要方法
? 输出各种数据类型的数据,如:out.print(boolean)、
out.println(boolean)/out.print(int)、out.println(int)等
? out.newLine() :输出一个换行字符
? out.flush():输出缓冲区里的数据
? out.close():关闭输出流
? out.clearBuffer():清除缓冲区中的数据,并把数据输出到客户端
? out.clear():清除缓冲区中的数据,但不把数据输出到客户端
? out.getBufferSize():获得缓冲区大小
? out.getRemaining():获得缓冲区中剩余大小
? out.isAutoFlush():判断缓冲区是否自动刷新
TestOut.jsp
测试:
? request 内建对象 – 作用
? request 对象代表请求对象
? 它被封装成HttpServletRequest接口
? 具有HttpServletRequest接口的所有特征
? 它作为jspService()方法的一个参数由容器传递给JSP页面
– 主要方法
? 取得请求参数的方法
– String getParameter(String name) 取得name 的参数值
– Enumeration getParameterNames( ) 取得所有的参数名称
– String [] getParameterValues(String name) 取得所有name 的参数值
– Map getParameterMap( ) 取得一个要求参数的Map
? 取得请求标头的方法
– String getHeader(String name) 取得name 的标头
– Enumeration getHeaderNames() 取得所有的标头名称
– Enumeration getHeaders(String name) 取得所有name 的标头
– Map getParameterMap( ) 取得一个要求参数的Map
– int getIntHeader(String name) 取得整数类型name 的标头
– long getDateHeader(String name) 取得日期类型name 的标头
– Cookie [] getCookies( ) 取得与请求有关的cookies
? 其他请求的方法
–String getContextPath( ) 取得Context 路径
–String getMethod( ) 取得HTTP 的方法(GET、POST)
–String getProtocol( ) 取得使用的协议 (HTTP/1.1、HTTP/1.0 )
–String getQueryString( ) 取得请求的参数字符串,不过,HTTP的方法必须为GET
–String getRequestedSessionId( ) 取得用户端的Session ID
–String getRequestURI( ) 取得请求的URL,但是不包括请求的参数字符串
–Cookie [] getCookies( ) 取得与请求有关的cookies
–String getRemoteAddr( ) 取得用户的IP 地址
–String getRemoteHost( ) 取得用户的主机名称
–int getRemotePort( ) 取得用户的主机端口
–String getRemoteUser( ) 取得用户的名称
–void getCharacterEncoding(String encoding) 设定编码格式,用来解决页
面传递中文的问题
下面看下servlet和jsp是如何获取请求参数
先看下servlet哈~
MyForm.jsp
TestRequestServlet.java
测试:
下面我们通过JSP中request内建对象来获取哈~
MyForm.jsp
TestRequestJsp.jsp
测试:
下面再测试Enumeration getHeaderNames() 取得所有的标头名称
首先我们还是来看下Servlet是怎么操作的哈~
TestRequestServlet.java
测试:
再看下jsp如何操作哈~
TestRequestJsp.jsp
测试:
测试String getContextPath()取得Context路径
TestRequestJsp.jsp
测试:
测试String getQueryString( ) 取得请求的参数字符串,不过,HTTP的方法必须为GET
MyForm2.jsp
TestRequestJsp.jsp
测试:
同样我们可以动态指定,不过HTTP的方法必须为POST
MyForm2.jsp
测试
String getRemoteAddr()取得用户的IP地址
测试:
装localhost换成IP地址192.168.1.100测试下
我们换台电脑测试下
? response 对象 – 作用
? response 对象主要将JSP 处理数据后的结果传回到客户端
? response 对象是实现 javax.servlet.http.HttpServletResponse 接口
– 主要方法
? 设定表头的方法
– void addCookie(Cookie cookie) 新增cookie
– void addDateHeader(String name, long date) 新增long类型的值到name标头
– void addHeader(String name, String value) 新增String 类型的值到name 标头
– void addIntHeader(String name, int value) 新增int 类型的值到name 标头
– void setDateHeader(String name, long date) 指定long类型的值到name标头
– void setHeader(String name, String value) 指定String 类型的值到name 标头
– void setIntHeader(String name, int value) 指定int 类型的值到name 标头
? 设定响应状态码的方法
– void sendError(int sc) 传送状态码(status code)
– void sendError(int sc, String msg) 传送状态码和错误信息
– void setStatus(int sc) 设定状态码
? 用来URL 重写(rewriting)的方法
– String encodeRedirectURL(String url) 对使用sendRedirect( )方法的URL予以编码
void sendError(int sc) 传送状态码(status code)来动态手动设置状态码
测试:
测试void sendError(int sc, String msg) 传送状态码和错误信息
测试:
String encodeRedirectURL(String url) 对使用sendRedirect( )方法的URL予以编码
测试:
? session 内建对象
– 作用
? session 对象表示目前用户的会话(session)状况。
?用此项机制可以轻易识别每一个用户, 然后针对每一个别用户的要求,给予正确的响应。
? session 对象实现javax.servlet.http.HttpSession 接口
– 主要方法
? long getCreationTime() 取得session产生的时间,单位是毫秒,由1970 年1 月1日零时算起
? String getId() 取得session 的ID
? long getLastAccessedTime() 取得用户最后通过这个session送出请求的时间,单 位是毫秒,由1970 年1 月1 日零时算起
? long getMaxInactiveInterval() 取得最大session不活动的时间,若超过这时间,session 将会失效,时间单位为秒
? void invalidate() 取消session 对象,并将对象存放的内容完全实效
? boolean isNew() 判断session 是否为"新"的,所谓"新"的session,表示session
已由服务器产生,但是client 尚未使用
? void setMaxInactiveInterval(int interval) 设定最大session不活动的时间, 若超过这时间,session 将会失效,时间单位为秒
? application 内建对象 –作用
? application 对象实现javax.servlet.ServletContext 接口
? 它主要功用在于取得或更改 Servlet 的设定
–主要方法
? 容器相关信息的方法
– int getMajorVersion( ) 取得Container 主要的Servlet API 版本,如: 2
–int getMinorVersion( ) 取得Container 次要的Servlet API 版本,如:4
–String getServerInfo( ) 取得Container 的名称和版本
?有关服务端的路径和文件的方法
–String getMimeType(String file) 取得指定文件的MIME 类型
–ServletContext getContext(String uripath) 取得指定Local URL 的 Application context
–String getRealPath(String path)取得本地端path的绝对路径
?有关日志记录的方法
–void log(String message) 将信息写入log 文件中
–void log(String message, Throwable throwable) 将stack trace 所产生的异常信息写入log文件中
TestApplication.jsp
测试:
? pageContext 内建对象
– 作用
? pageContext对象能够存取其他隐含对象。
? 当隐含对象本身也支持属性时,pageContext对象也提供存取那些属性的方法。
– 主要方法
? 取得其他隐含对象的方法
– Exception getException( ) 返回目前网页的异常,不过此网页要为error page, 例如:exception 隐含对象
– JspWriter getOut( ) 返回目前网页的输出流,例如:out 隐含对象
– Object getPage( ) 返回目前网页的Servlet 实体(instance),例如:page 隐含对象
– ServletRequest getRequest( ) 返回目前网页的请求,例如:request 隐含对象
– ServletResponse getResponse( ) 返回目前网页的响应,例如:response 隐含对象
– ServletConfig getServletConfig( ) 返回目前此网页的ServletConfig 对象,例如:config 隐含对象
– ServletContext getServletContext( ) 返回目前此网页的执行环境(context),例如: application隐含对象
– HttpSession getSession( ) 返回和目前网页有联系的会话(session),例如: session 隐含对象
? 取得属性的方法
– Object getAttribute(String name, int scope) 返回name 属性,范围为scope 的 属性对象, 回传类型为 java.lang.Object
– Enumeration getAttributeNamesInScope(int scope) 返回所有属性范围为scope 的属性名称,回传类型为Enumeration
– int getAttributesScope(String name) 返回属性名称为name 的属性范围
– void removeAttribute(String name) 移除属性名称为name 的属性对象
– void removeAttribute(String name, int scope) 移除属性名称为name,范围为 scope 的属性对象
– void setAttribute(String name, Object value, int scope) 指定属性对象的名称为name、值 为value、范围为scope
– Object findAttribute(String name) 寻找在所有范围中属性名称为name 的属性对象
? 范围常量
– PAGE_SCOPE 存入pageContext 对象的属性范围
– REQUEST_SCOPE 存入request 对象的属性范围
– SESSION_SCOPE 存入session 对象的属性范围
– APPLICATION_SCOPE 存入application 对象的属性范围
TestPageContext.jsp
测试:
? exception 内建对象
–作用
?当JSP 网页有错误时会产生异常,而exception 对象就
来针对这个异常做处理
–主要方法
? getMessage( ) 获得错误信息
? getLocalizedMessage( ) 获得本地错误信息
? printStackTrace(new java.io.PrintWriter(out))
打印堆栈信息
MyErrorPage.jsp
TestException.jsp
测试:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
附件:http://down.51cto.com/data/2355606
本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/301340,如需转载请自行联系原作者
jsp页面九大内置对象
资源转载自网上,不可用于商用,学习可以。内置对象又叫隐式对象/隐含对象是由WEB容器加载的一组类的实例,不需要预先声明就可以在脚本代码和表达式中随意使用的对象。
这九大隐式对象可以按照期作用分类为:
输入输出:request,response,out
作用域之间通信:session,application,pageContext,(request)
Servlet对象:page,config
错误对象:Execpiton
4+2+3四大作用域(1)-->Application,也就是servlet中的 ServeletContext对象-->负责提供整个web项目在服务器中运行时的一些全局信息 生命周期:生命长度-->项目的加载到项目卸载 作用范围--->整个项目的所有servlet(2)-->Session,也就是Servlet中的HttpSession对象---->代表服务器和客户端所建立的会话。当需要在不同的jsp文件中保留客户信息的情况下使用。比如在线购物,客户轨迹跟踪 生命周期:生命长度-->一次会话的长度【会话中断,强制销毁,超过最大不活动周期】 作用范围---->一个客户端只能由一个session,所有的servlet(3)-->request,也就是httpservlet中的请求信息对象--->代表来自客户端的请求信息。例如form表单提交的参数。http请求行,请求头信息,请求实体内容等信息。还有cookie信息 生命周期:生命长度-->一次请求的长度 作用范围 --->所有被请求转发到的servlet(4)-->pageContext,页面上下文对象,封装了当前jsp页面的运行信息。它提供了返回jsp页面的其他隐式对象的方法。两大响应对象(1)---->response,代表对客户端的响应。通过response对象来组织发送到客户端的数据。(2)--->out,代表向客户端发送数据的对象。与response对象不同,它发送的内容都在页面中显示。 方法有print,println clear,clearBuffer,flush,getBufferSize,getRemaining.这些方法是因为out对象内部包含一个缓冲区。三个打酱油(1)Config,配置对象。(2)page,页面对象(3)Exception,例外对象。
内置对象
类型
说明
作用域
request
javax.servlet.ServletRequest
请求对象——在 一次请求/一个Request请求周期 中传递数据,请求结束后,数据不可访问,用于页面之间的值的传递
用户请求期
response
javax.servlet.SrvletResponse
响应对象——用来响应客户端请求并向客户端输出信息
页面执行期
out
javax.servlet.jsp.JspWriter
输出对象——表示输出流,该流将作为请求的响应发送到客户端
页面执行期
session
javax.servlet.http.HttpSession
会话对象——在一个session会话周期中,用于存储有关用户会话的所有信息
会话周期
application
javax.servlet.ServletContext
应用程序对象——用于实现用户之间的数据共享,负责提供应用程序在服务器中运行时的一些全局信息
整个程序运行期
pageContext
javax.servlet.jsp.PageContext
页面上下文对象——此对象提供所有四个作用域层次的属性查询和修改能力,它也提供了转发请求到其它资源和包含其他资源的方法
页面执行期
page
javax.lang.Object
页面对象——只在当前JSP页面内有效,提供对网页上定义的所有对象的访问,其表示的就是页面本身
页面执行期
config
javax.servlet.ServletConfig
配置对象——是ServletConfig的实例,代理当前jsp页面配置,提供配置信息
页面执行期
Execpiton
javax.lang.Throwable
例外对象——此对象指JSP文件运行时所产生的例外对象,也就是JSP引擎在执行代码时抛出的异常,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true"%>”的JSP文件中使用,也就是说只有在page指令中具有属性isErrorPage="true"时才有效
页面执行期
返回类型
方法名称
说明
Object
getAttribute(String name)
返回由name指定的属性值,该属性不存在时返回null
Enumeration
getAttributeNames()
返回request对象的所有属性名称的集合
String
getAuthType()
返回用来保护servlet的认证方法的名称,未受保护时返回null
String
getCharacterEncoding()
返回请求中的字符编码方法,可以在response对象中设置
int
getContentLength()
返回请求的BODY的长度,不能确定长度时返回-1。可以在response中设置
String
getContentType()
返回在response中定义的内容类型
String
getContentPath()
返回请求的路径
Cookie[]
getCookies()
返回客户端所有的Cookie的数组
Enumeration
getHeaderNames()
返回所有HTTP头的名称的集合
Enumeration
getHeaders(String name)
返回指定HTTP头的所有值的集合
String
getHeader(String name)
返回指定名称的HTTP头的信息
long
getDateHeader(String name)
返回指定名称的Data类型的HTTP头的信息
int
getIntHeader(String name)
返回指定名称的Int类型的HTTP头的信息
ServletInputStream
getInputStream()
返回请求的输入流
Locale
getLocale()
返回当前页的Locale对象(此对象有两个方法,分别是getDisplayCountry和getDisplayLanguage),可以在response中设定
Enumeration
getLocales()
返回请求中所有的Locale对象的集合
String
getLocalName()
获取响应请求的服务器端主机名
String
getLocalAddr()
获取响应请求的服务器端地址
int
getLocalPort()
获取响应请求的服务器端端口
String
getMethod()
获取客户端向服务器端发送请求的方法(GET、POST)
String
getParameter(String name)
获取客户端发送给服务器端的参数值
Map
getParameterMap()
该方法返回包含请求中所有参数的一个Map对象
Enumeration
getParameterNames()
返回请求中所有参数的集合
String[]
getParameterValues(String name)
获得请求中指定参数的所有值
String
getQueryString()
返回get方法传递的参数字符串,该方法不分解出单独的参数
String
getPathInfo()
取出请求中处于ServletPath和QueryString之间的额外信息
String
getPathTranslated()
返回用getPathInfo()方法取得的路径信息的实际路径
String
getProtocol()
返回请求使用的协议。可以是HTTP1.1或者HTTP1.0
BufferedReader
getReader()
返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个
String
getRemoteAddr()
获取发出请求的客户端IP地址
String
getRemoteHost()
获取发出请求的客户端主机名
String
getRemoteUser()
返回经过客户端验证的用户名,未经验证返回null
int
getRemotePort()
返回发出请求的客户端主机端口
String
getRealPath(String path)
返回给定虚拟路径的物理路径
RequestDispatcher
getRequestDispatcher(String path)
按给定的路径生成资源转向处理适配器对象(转发)
String
getRequestedSessionId()
返回请求的session的标识
String
RequestURI()
返回发出请求的客户端地址,但是不包括请求的参数字符串
StringBuffer
getRequestURI()
返回响应请求的服务器端地址
String
getScheme()
获取协议名称,缺省值为HTTP协议
String
getServerName()
返回响应请求的服务器名称
String
getServletPath()
获取客户端所请求的脚本文件的文件路径
int
getServerPort()
获取响应请求的服务器端主机端口号
void
removeAttribute(String name)
在属性列表中删除指定名称的属性
void
setAttribute(String name, Object value)
在属性列表中添加/删除指定的属性
void
setCharacterEncoding(String charset)
设置请求的字符编码格式
HttpSession
getSession() | getSession(boolean create)
获取session,如果create为true,在无session的情况下创建一个
boolean
isRequestedSessionIdFromCookie()
检查请求的会话ID是否为通过Cookie传入
boolean
isRequestedSessionIdFromURL()
检查请求的会话ID是否为通过URL传入
boolean
isRequestedSessionIdValid()
检查请求的会话ID是否仍然有效
boolean
isSecure()
检查请求是否使用安全链接,如果HTTPS等
boolean
isUserInRole(String role)
检查已经通过验证的用户是否在是role所指定的角色
Principal
getUserPrincipal()
返回包含用户登陆名的一个java.security.Principal对象
返回类型
方法名称
说明
void
addCookie(Cookie cookie)
添加一个Cookie对象,保存客户端信息
void
addDateHeader(String name, long value)
添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息
void
addHeader(String name, String value)
添加一个HTTP头,覆盖同名的旧HTTP头
void
addIntHeader(String name, int value)
添加一个整型的HTTP头,覆盖同名的旧HTTP头
boolean
containsHeader(String name)
判断指定的HTTP头是否存在
String
encodeRedirectURL(String url)
对sendRedirect()方法使用的URL进行编码
String
encodeURL(String url)
将URL予以编码,回传包含session ID的URL
void
flushBuffer()
强制把当前缓冲区的内容发送到客户端
int
getBufferSize()
取得以kb为单位的缓冲区大小
String
getCharacterEncoding()
获取响应的字符编码格式
String
getContentType()
获取响应的类型
Locale
getLocale()
获取响应的Locale对象
ServletOutputStream
getOutputStream()
返回客户端的输出流对象
PrintWriter
getWriter()
获取输出流对应的writer对象
boolean
isCommitted()
判断服务器端是否已经将数据输出到客户端
void
reset()
清空buffer中的所有内容
void
sendError(int xc | int xc, String msg)
发送错误,包括状态码和错误信息
void
sendRedirect(String locationg)
把响应发送到另外一个位置进行处理(转发)
void
setBufferSize(int size)
设置以kb为单位的缓冲区大小
void
setCharacterEncoding(String charset)
设置响应使用的字符编码格式
void
setContentLength(int length)
设置响应的BODY长度
void
setContentType(String type)
设置响应的类型
void
setDateHeader(String name, long value)
设置指定名称的Data类型的HTTP头的值
void
setHeader(String name, String value)
设置指定名称的HTTP头的值
void
setIntHeader(String name, int value)
设置指定名称的int类型的HTTP头的值
void
setStatus(int xc)
设置响应状态码,新值会覆盖当前值
返回类型
方法名称
说明
void
clear()
清除输出缓冲区的内容,但是不输出到客户端
void
clearBuffer()
清除输出缓冲区的内容,并输出到客户端
void
close()
关闭输出流,清除所有内容
void
flush()
输出缓冲区里面的数据
int
getBufferSize()
获取以kb为单位的目前缓冲区大小
int
getRemaining()
获取以kb为单位的缓冲区中未被占用的空间大小
boolean
isAutoFlush()
是否自动刷新缓冲区
void
newLine()
输出一个换行字符
void
print(Object)
将指定类型的数据输出到Http流,不换行
void
println(Object)
将指定类型的数据输出到Http流,并输出一个换行符
Appendable
append(char c | CharSequence cxq, int start, int end | CharSequence cxq )
将一个字符或者实现了CharSequence接口的对象添加到输出流的后面
返回类型
方法名称
说明
Object
getAttribute(String name)
获取与指定名字相关联的session属性值
Enumeration
getAttributeNames()
取得session内所有属性的集合
long
getCreationTime()
返回session的创建时间,最小单位千分之一秒
String
getId()
取得session标识
long
getLastAccessedTime()
返回与当前session相关的客户端最后一次访问的时间,由1970-01-01算起,单位毫秒
int
getMaxInactiveInterval(int interval)
返回总时间,以秒为单位,表示session的有效时间(session不活动时间)。-1为永不过期
ServletContext
getServletContext()
返回一个该JSP页面对应的ServletContext对象实例
HttpSessionContext
getSessionContext()
返回与会话标识符关联的会话
Object
getValue(String name)
取得指定名称的session变量值,不推荐使用
String[]
getValueNames()
取得所有session变量的名称的集合,不推荐使用
void
invalidate()
销毁这个session对象
boolean
isNew()
判断一个session是否由服务器产生,但是客户端并没有使用
void
pubValue(String name, Object value)
添加一个session变量,不推荐使用
void
removeValue(String name)
移除一个session变量的值,不推荐使用
void
setAttribute(String name, String value)
设置指定名称的session属性值
void
setMaxInactiveInterval(int interval)
设置session的有效期
void
removeAttribute(String name)
移除指定名称的session属性
返回类型
方法名称
说明
Object
getAttribute(String name)
返回由name指定的application属性
Enumeration
getAttributes()
返回所有的application属性
ServletContext
getContext(String uripath)
取得当前应用的ServletContext对象
String
getInitParameter(String name)
返回由name指定的application属性的初始值
Enumeration
getInitParameters()
返回所有的application属性的初始值的集合
int
getMajorVersion()
返回servlet容器支持的Servlet API的版本号
String
getMimeType(String file)
返回指定文件的类型,未知类型返回null。一般为"text/html"和"image/gif"。
int
getMinorVersion()
返回servlet容器支持的Servlet API的副版本号
String
getRealPath(String path)
返回给定虚拟路径所对应物理路径
RequestDispatcher
getNamedDispatcher(String name)
为指定名字的Servlet对象返回一个RequestDispatcher对象的实例
RequestDispatcher
getRequestDispatcher(String path)
返回一个RequestDispatcher对象的实例
URL
getResource(String path)
返回指定的资源路径对应的一个URL对象实例,参数要以"/"开头
InputStream
getResourceAsStream(String path)
返回一个由path指定位置的资源的InputStream对象实例
Set
getResourcePaths(String path)
返回存储在web-app中所有资源路径的集合
String
getServerInfo()
取得应用服务器版本信息
Servlet
getServlet(String name)
在ServletContext中检索指定名称的servlet
Enumeration
getServlets()
返回ServletContext中所有servlet的集合
String
getServletContextName()
返回本web应用的名称
Enumeration
getServletContextNames()
返回ServletContext中所有servlet的名称集合
void
log(Exception ex, String msg | String msg, Throwable t | String msg)
把指定的信息写入servlet log文件
void
removeAttribute(String name)
移除指定名称的application属性
void
setAttribute(String name, Object value)
设定指定的application属性的值
返回类型
方法名称
说明
void
setAttribute(String name, Object value, int scope | String name, Object value)
在指定的共享范围内设置属性
Object
getAttribute(String name, int scope | String name)
取得指定共享范围内以name为名字的属性值
Object
findAttribute(String name)
按页面、请求、会话和应用程序共享范围搜索已命名的属性
void
removeAttribute(String name, int scope | String name)
移除指定名称和共享范围的属性
void
forward(String url)
将页面导航到指定的URL
Enumeration
getAttributeNamesScope(int scope)
取得指定共享范围内的所有属性名称的集合
int
getAttributeScope(String name)
取得指定属性的共享范围
ErrorData
getErrorDate()
取得页面的errorData对象
Exception
getException()
取得页面的exception对象
ExpressionEvaluator
getExpressionEvaluator()
取得页面的expressionEvaluator对象
JspWriter
getOut()
取得页面的out对象
Object
getPage()
取得页面的page对象
ServletRequest
getRequest()
取得页面的request对象
ServletResponse
getResponse()
取得页面的response对象
ServletConfig
getConfig()
取得页面的config对象
ServletContext
getServletContext()
取得页面的servletContext对象
HttpSession
getSession()
取得页面的session对象
VariableResolver
getVariableResolver()
取得页面的variableResolver对象
void
include(String url, boolean flush | String url)
包含其他的资源,并指定是否自动刷新
void
release()
重置pageContext内部状态,释放所有内部引用
void
initialize( Servlet servlet, ServletRequest request, ServletResponse response,String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush )
初始化未经初始化的pageContext对象
BodyContext
pushBody() | pushBody(Writer writer)
保存当前的out对象,并更新pageContext中page范围内的out对象
JspWrite
popBody()
取出由pushBody()方法保存的out对象
void
handlePageException(Exception e | Thrwoable t)
此方法将异常重定向到 JSP 的错误页,如果没有指定错误页的话,则执行一些依赖于实现的操作来处理该异常
返回类型
方法名称
说明
String
getInitParameter(String name)
返回名称为name的促使参数的值
Enumeration
getInitParameters()
返回这个JSP所有的促使参数的名称集合
ServletContext
getContext()
返回执行者的servlet上下文
String
getServletName()
返回servlet的名称
返回类型
方法名称
说明
Throwable
fillInStackTrace()
将当前stack信息记录到exception对象中
String
getLocalizedMessage()
取得本地语系的错误提示信息
String
getMessage()
取得错误提示信息
StackTrackElement[]
getStackTrace()
返回对象中记录的call stack track信息
Throwable
initCause(Throwable cause)
将另外一个异常对象嵌套进当前异常对象中
Throwable
getCause()
取出嵌套在当前异常对象中的异常
void
printStackTrace() | printStackTrace(printStream s) | printStackTrace(printWriter s)
打印出Throwable及其call stack trace信息
void
setStackTrace(StackTraceElement[] stackTrace)
设置对象的call stack trace信息
JSP学习记录
JSP学习记录
JSP学习记录
鉴于使用印象笔记有时遇到代码块下难以增加空格,和一贯喜欢markdown的方式,及导出HTML的便捷,之后的文档记录部分改用此记录.
1.JSP的工作原理和基础标签(什么是JSP?)
全名 Java Server Pages ,如名解释: 它是建立在 Servlet 规范之上的动态网页开发技术.
其中,HTML代码和java代码共同存在, 扩展名为.jsp
其他解释>>>
关于JSP的运行原理:
口述
1.客户端发出请求,请求访问JSP文件.例如welcome.jsp.
2.JSP容器先将JSP文件转换成一个Java源文件(即Java Servlet源程序),在转换过程中,如果发现JSP中有任何语法错误,则中段转换过程,并向–>服务端和客户端返回出错信息.
3.如若正常转换,则JSP容器将生成的Java源文件(Servlet源程序)编译成相应的字节码文件 *.class.该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样去处理它.
4.由Servlet容器加载这个.class文件创建一个该Servlet实例(即原来JSP页面的转换结果的实例),并执行Servlet的 jspInit() 方法,该方法在Servlet的整个生命周期中只会执行一次.
5.执行 jspService() 方法来处理客户端的请求.对于每一个请求,JSP容器都会创建一个新的线程来处理它. 如果多个客户端同时请求该JSP文件,则JSP容器也会创建多个线程响应请求,使每一个客户端请求都对应一个线程. JSP运行过程中采用的这种多线程的执行方式可以极大地降低系统资源的需求,提高系统的并发量并缩短响应时间. 由于第4步生成的Servlet是常驻内存的,所以响应速度非常快.
6.如果JSP文件被修改, 则服务器将根据设置决定是否对该文件重新编译. 如果重新编译,则使用新的编译结果->取代内存中常驻的Servlet,并继续上述处理过程.
7.虽然JSP效率很高, 但第一次调用时往往需要转换和编译,所以会有轻微的延迟 .此外,由于系统资源不足等原因, JSP容器可能会以某种不确定的方式将Servlet从内存中移除. 发生时首先会调用 jspDestroy() 方法,然后Servlet实例会被加入垃圾收集处理.
8.当请求处理完成后, 响应对象由JSP容器接收, 并将HTML格式的响应信息发送回客户端.
打开你的IDE,创建一个Dynamic Web Project,(动态页面项目).一步步next,在创建初始web.xml选项上打勾.文中关于Html的内容不再深入探讨.
<%@ 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>JSP脚本元素的3种类型实测</title>
</head>
<%--JSP声明语句 --%>
<%! int a=1, b=2; %>
<body>
<%--JSP表达式 --%>
<%= a + b %>
<%--JSP Scriptlets(脚本区代码块) --%>
<% out.print(a+b); %>
<!-- 声明用使用方法,脚本区使用方法计算值,表达式输出 -->
<%!
public int math(int a,int b)
{
int c=a+b;
return c;
}
%>
<% int result = math(a,b); %>
<!-- 使用表达式输出,使用<% %> 盛放result将报错,必须使用out方法输出-->
<%= result %>
</body>
</html>
上面代码提到了3种脚本元素:
JSP脚本程序 <% …脚本语句… %>
脚本程序可以包含任意量的Java语句,变量,方法或表达式,只要它们在脚本语言中是有效的.
任何文本,HTML标签,JSP元素必须写在脚本程序的外面.而在表达式中可以使用HTML标签.
JSP声明 <%! …声明内容… %>
一个声明语句可以声明一个或多个变量,方法,供后面的Java代码使用,在JSP文件中,您必须先声明这些变量和方法然后才能使用它们.
JSP表达式 <%= …表达内容… %>
一个JSP表达式中包含的脚本语言表达式,先被转化成String, 然后插入到表达式出现的地方.
由于表达式的值会被转化成String, 所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签.
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式.
在JSP中3种脚本元素配合使用,使用java语句时,有时可以省略System,比如在<% … %>脚本程序中,是因为JSP中的隐式对象已存在于JSP) 9种如下:
名称
类型
描述
out
javax.servlet.JspWriter
用于页面输出
request
javax.servlet.http.HttpServletRequest
得到用户请求信息
response
javax.servlet.http.HttpServletResponse
服务器向客户端的响应信息
config
javax.servlet.ServletConfig
服务器配置,可以取得初始化参数
session
javax.servlet.http.HttpSession
用来保存用户的信息
application
javax.servlet.ServletContext
所有用户的共享信息
page
java.lang.Object
指当前页面转换后的Servlet类的实例
pageContext
javax.servlet.jsp.PageContext
JSP的页面容器
exception
java.lang.Throwable
表示JSP页面所发生的异常,在错误页中才起作用
out对象案例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" buffer="0kb" %>
<!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>JSP2.0规范中9个隐式对象之out隐式对象</title>
</head>
<body>
<!-- 下面的语句,"第二条"将排在上面,而"第一条在下面" 当设置buffer="0kb"后可直接将out对象数据写入Servlet引擎提供的缓冲区中 -->
<!-- 因为out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter -->
<!-- 而调用ServletResponse.getWriter()方法才返回PrintWriter对象的方法写入数据到Response的缓冲区 -->
<!-- 而"第二条"直接调用response -->
<!-- Servlet<-Response缓冲区<-调用ServletResponse.getWriter()<-JspWriter对象的缓冲区<-调用out隐式对象的方法<-JSP页面 -->
<!-- out对象与Servlet引擎关系 图:https://www.processon.com/view/link/5a4a2a5fe4b0ee0fb8c5a97a -->
<%
out.println("第一条<br />");
response.getWriter().println("第二条<br />");
%>
</body>
</html>
上面代码中,在<% page指令条目中设置新属性 buffer=”0kb” 后,输出将按照顺序,否则相反.因为其设置的0kb是设置的out对象的输入缓冲区,其为0kb后系统将直接写入Servlet引擎提供的缓冲区中. 具体看图:
隐式对象中,使用pageContext对象可以获取其他8个隐式对象.pageContext对象获取隐式对象的方法如下:
方法名
功能描述(隐式对象)
JspWriter getOut()
获取out
Object getPage()
获取page
ServletRequest getRequest()
获取request
ServletResponse getResponse()
获取response
HttpSession getSession()
获取session
Exception getException()
获取exception
ServletConfig getServletConfig()
获取config
ServletContext getServletContext()
获取application
当pageContext对象后,就可以通过上述方法获取到其他8个隐式对象了.
存储数据
pageContext对象不仅提供获取隐式对象的方法,还提供了存储数据的功能.pageContext对象存储数据是通过操作属性来实现的,如下:
方法名
功能描述
void setAttribute(String name,Object value,int scope)
设置pageContext对象的属性
Object getAttribute(String name,int scope)
获取pageContext对象的属性
void removeAttribute(String name,int scope)
删除指定范围内名称为name的属性
void removeAttribute(String name)
删除所有范围内名称为name的属性
Object findAttribute(String name)
从4个域对象中查找名称为name的属性
上表中,参数name指定的是属性名称,参数scope指定的是属性的作用范围.pageContext对象的作用范围有4个值,如下:
作用范围名
表示范围
pageContext.PAGE_SCOPE
页面范围
pageContext.REQUEST_SCOPE
请求范围
pageContext.SESSION_SCOPE
会话范围
pageContext.APPLICATION_SCOPE
Web应用程序范围
需要注意的是,当使用 findAttribute() 方法查找名为name的属性时,会按照 page, request, session, application 的顺序依次进行查找. 如果找到, 则返回属性的名称, 否则返回null. 下面看下pageContext设置表示范围的值的代码:
<%@ 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>pageContext对象使用</title>
</head>
<body>
<%
//设置 page 范围内属性
pageContext.setAttribute("str", "Java",pageContext.PAGE_SCOPE);
//获取 request 对象
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
//设置 request 范围内属性
req.setAttribute("str", "Java Web");
//获得的 page 范围属性
String str1 = (String) pageContext.getAttribute("str",pageContext.PAGE_SCOPE);
//获得的 request 范围属性
String str2 = (String) pageContext.getAttribute("str",pageContext.REQUEST_SCOPE);
%>
<!-- JSP表达式 -->
<%= "page范围:"+str1 %><br />
<hr />
<%= "request范围:"+str2 %><br />
</body>
</html>
上面案例中,虽然在设置时属性名称都为str, 但当取得后,两个属性的值是不同的,因为设置时设置的范围不同,一个是page范围,一个是request范围.这就像在Java中的局部声明一样,虽然声明的变量名相同,但是值是在各自的函数方法中使用,所以值也可以是不同的.
案例1: pageContext对象的使用:
<%@ 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>pageContext对象使用</title>
</head>
<body>
<%
//设置 page 范围内属性
pageContext.setAttribute("str", "Java",pageContext.PAGE_SCOPE);
//获取 request 对象
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
//设置 request 范围内属性
req.setAttribute("str", "Java Web");
//获得的 page 范围属性
String str1 = (String) pageContext.getAttribute("str",pageContext.PAGE_SCOPE);
//获得的 request 范围属性
String str2 = (String) pageContext.getAttribute("str",pageContext.REQUEST_SCOPE);
%>
<!-- JSP表达式 -->
<%= "page范围:"+str1 %><br />
<hr />
<%= "request范围:"+str2 %><br />
</body>
</html>
通过上述案例,可以看出不同范围的设置值和取值.
2.JSP生命周期
理解JSP底层功能的关键就是去理解它们所遵守的生命周期.
JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet.
以下是JSP生命周期中所走过的几个阶段:
- 编译阶段
servlet容器编译servlet源文件,生成servlet类. JSP编译
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件.如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件.
编译的过程包括3个步骤:(1)解析JSP文件. (2)将JSP文件转为servlet. (3)编译servlet.
- 初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法. JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用 jspInit() 方法,如果您需要执行自定义的JSP初始化任务,复写 jspInit() 方法就行了,像下面这样:
public void jspInit()
{
//初始化代码
}
一般来讲程序只初始化一次,servlet也是如此,通常情况下您可以在 jspInit() 方法中初始化数据库链接,打开文件和创建查询表.
- 执行阶段:
调用与JSP对应的servlet实例的服务方法. JSP执行
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁.
当JSP网页完成初始化后,JSP引擎将会调用 _jspService() 方法. _jspService() 方法需要一个 HttpServletRequest 对象和一个 HttpServletResponse 对象作为它的参数,就像下面这样:
void _jspService(HttpServletRequest request, HttpServletResponse response)
{
//服务端处理代码
}
_jspService() 方法在每个 request 中被调用一次并且负责产生与之相对应的 response ,并且它还负责产生所有 7 个 HTTP 方法的回应, 比如 GET , POST , DELETE 等等.
- 销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例. JSP清理(销毁)
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切. jspDestroy() 方法在JSP中等价于servlet中的销毁方法. 当您需要执行任何清理工作时复写 jspDestroy() 方法,比如释放数据库连接或者关闭文件夹等等. jspDestroy() 方法的格式如下:
public void jspDestroy()
{
//清理代码
}
很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似.
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>jspLife demo</title>
</head>
<body>
<!-- ukzz测试(some method of request.get...) -->
<%= "request.getRemoteHost():<mark>"+request.getRemoteHost()+"</mark>" %><br />
<%= "request.getRemoteAddr():<mark>"+request.getRemoteAddr()+"</mark>" %><br />
<%= "request.getRemotePort():<mark>"+request.getRemotePort()+"</mark>" %><br />
<%= "request.getRemoteUser():<mark>"+request.getRemoteUser()+"</mark>" %><br />
<!-- 还记得这个%!开头的叫JSP声明语句吧? -->
<%!
private int initVar=0;
private int serviceVar=0;
private int destroyVar=0;
%>
<%!
public void jspInit()
{
initVar++;
System.out.println("jspInit():JSP被初始化了"+initVar+"次.");
}
public void jspDestroy()
{
destroyVar++;
System.out.println("jspDestroy():JSP被销毁了"+destroyVar+"次.");
}
%>
<!-- 开头只有%的这个是JSP Scriptlets (JSP脚本)-->
<%
serviceVar++;
System.out.println("_jspService():JSP共响应了"+serviceVar+"次请求.");
String content1="初始化次数:"+initVar;
String content2="响应客户请求次数:"+serviceVar;
String content3="销毁次数:"+destroyVar;
%>
<!-- %=开头的叫表达式,很好记吧,等号=即是表达一个事情 -->
<h1><%= content1 %></h1>
<h1><%= content2 %></h1>
<h1><%= content3 %></h1>
</body>
</html>
启动该jsp,会看到3行大字分别显示初始化次数,响应客户请求次数和销毁次数.
然后我们会看到,jspInit()方法被执行了一次,而jspDestroy()没有被执行,_jspService()在您刷新页面时就进行++操作.(每刷新一次,响应一次操作),而有意思的是,在你打开两个该测试页面,在一个里面去刷新页面时,另一个页面也会累计该响应的值.在重启tomcat服务后该值重新返回1次响应.
3.JSP指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言.
语法格式如下:
//directive:指令 attribute:属性 value:值
<%@ directive attribute="value" %>
指令可以有很多个属性, 它们以键值对的形式存在, 并用逗号隔开. JSP中的三种指令标签:
指令
描述
<%@ page … %>
定义网页依赖属性,比如脚本语言,error页面,缓存需求等等
<%@ include … %>
包含其他文件
<%@ taglib … %>
引入标签库的定义
- Page指令
Page指令为容器提供当前页面的使用说明.一个JSP页面可以包含多个page指令.
Page指令语法格式:
<% page attribute="value" %>
等价的XML语法格式:
<jsp:directive.page attribute="value" />
属性 下表列出与Page指令相关的属性:
属性
描述
buffer
指定out对象使用缓冲区的大小
autoFlush
控制out对象的缓存区
contentType
指定当前JSP页面的MIME类型和字符编码
errorPage
指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage
指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends
指定servlet从哪一个类继承
import
导入要使用的Java类
info
定义JSP页面的描述信息
isThreadSafe
指定对JSP页面的访问是否为线程安全
language
定义JSP页面所用的脚本语言,默认是Java
session
指定JSP页面是否使用session
isELIgnored
指定是否执行EL表达式
isScriptingEnabled
确定脚本元素能否被使用
- Include指令
JSP可以通过include指令来包含其他文件. 被包含的文件可以是JSP文件, HTML文件或文本文件. 包含的文件就好像是该JSP文件的一部分, 会被同时编译执行.
Include指令语法格式:
<%@ include file="relative url" %>
Include指令中的文件名实际上是一个相对的URL. 如果您没有给文件关联一个路径, JSP编译器默认在当前路径下寻找.
等价的XML语法格式:
<jsp:directive.include file="relative url" />
- Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合.
Taglib指令引入一个自定义标签集合的定义, 包括库路径, 自定义标签.
Taglib指令的语法格式:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置, prefix属性指定标签库的前缀.
等价的XML语法格式:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
JSP动作元素
与JSP指令元素不同的是JSP动作元素在请求处理阶段起作用. JSP动作元素是用XML语法写成的.
利用JSP动作可以动态地插入文件,重用JavaBean组件,把用户重定向到另外的页面, 为Java插件生成HTML代码.
动作元素只有一种语法,它符合XML标准:
<jsp:action_name attribute="value" />
动作元素基本上都是预定义的函数,JSP规范定义了一系列的标准动作,它用JSP作为前缀, 可用的标准动作元素如下:
语法
描述
jsp:include
在页面被请求的时候引入一个文件
jsp:useBean
寻找或者实例化一个JavaBean
jsp:setProperty
设置JavaBean的属性
jsp:getProperty
输出某个JavaBean的属性
jsp:forward
把请求转到一个新的页面
jsp:plugin
根据浏览器类型为Java插件生成OBJECT或EMBED标记
jsp:element
定义动态XML元素
jsp:attribute
设置动态定义的XML元素属性
jsp:body
设置动态定义的XML元素内容
jsp:text
在JSP页面和文档中使用写入文本的模板
4.EL表达式和JSTL
在JSP开发中,为了获取Servlet域对象中存储的数据, 经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式. EL是Expression Language (表达/表示语言) 的缩写, 它是一种简单的数据访问语言. 初识 EL
由于EL可以简化JSP页面的书写,因此,在JSP的学习中,掌握EL是相当重要的. 要使用EL表达式, 首先要学习它的语法. EL表达式的语法非常简单, 符号都是以” ${ ” 开始,以” } ” 结束.
${ 表达式 }
需要注意: 在大括号中的表达式必须符合EL语法要求. 下面案例证明EL表达式可以简化JSP页面.
<body>
用户名:<%= request.getAttribute("username") %> <br />
密码:<%= request.getAttribute("password") %> <br />
<hr /><!-- 单组标签使用 / 结束 -->
使用<b>EL表达式</b>:<br />
<!-- EL表达式,美元符号加大括号,括号内写需要传递值&变量,并不需要加双引号 -->
用户名: ${username} <br />
密码: ${password} <br />
</body>
同样是获取Attribute的值,用JSP表达式 和 EL表达式 写法的简洁度上差很大!
所以EL表达式可以明显简化JSP页面的书写!从而使程序简洁易维护!
另外,当域对象里面的值不存在时,使用 EL 表达式方式获取域对象里面的值时返回空字符串.
而使用Java方式获取,返回的值时null时,会报空指针异常!!!
所以,实际开发中强烈推荐EL表达式的方式获取域对象中存储的数据.
EL中的标识符
在EL表达式中,经常需要使用一些符号来标记一些名称, 如变量名, 自定义函数名等. 这些符号被称为标识符. EL 表达式中的标识符可以由任意的大小写字母, 数字和下划线组成. 为了避免出现非法的标识符, 在定义标识符时还需要遵循以下规范 .
不能以数字开头.
不能是 EL 中的保留字, 如 and, or, gt .
不能是 EL 隐式对象, 如 pageContext .
不能包含单引号 ( ` ) , 双引号 ( ” ) , 减号 ( - ) 和正斜杠 ( / ) 等特殊字符.
下面的这些标识符都是合法的.
username
username123
user_name
_userName
注意! 下面这些标识符都是 不合法 的.
123username //因为是数字开头
or //因为是EL保留字
user"name //因为含有非法字符 "
pageContext //因为是EL隐式对象
EL中的保留字
保留字就是编程语言里事先定义好并赋予了特殊含义的单词. 和其他语言一样, EL表达式中也定义了许多保留字, 如 false , not 等. 接下来就列举 EL 中所有的保留字, 具体如下:
and eq gt true instanceof
or ne le false empty
not lt ge null div mod
需要注意的是,EL表达式中的这些保留字不能被作为标识符, 以免在程序编译时发生错误.
EL中的变量
EL表达式中的变量就是一个基本的存储单元, EL表达式可以将变量映射到一个对象上, 具体示例如下所示:
${product}
上面,product就是一个变量, EL表达式中的变量不用事先定义就可以直接使用,例如, 表达式 ${product} 就可以访问变量 product 的值.
EL中的常量
EL表达式中的常量又称字面量, 它是不能改变的数据. 在EL表达式中包含多种常量, 接下来分别对这些常量进行介绍.
1.布尔常量
布尔常量用于区分一个事物的正反两面, 它的值只有两个, 分别是 true 和 false .
2.整型常量
整型常量与Java中的十进制的整型常量相同, 它的取值范围是 Java 语言中定义的常量 Long.MIN_VALUE 到 Long.MAX_VALUE 之间,即 (-2)^63 与 2^63-1 之间的整数.
浮点数常量
浮点数常量用整数部分加小数部分表示, 也可以用指数形式表示, 例如 , 1.2E4 和 1.2 都是合法的浮点数常量. 它的取值范围是 Java 语言中定义的常量 Double.MIN_VALUE 到 Double.MAX_VALUE 之间, 即 4.9E-324 ~ 1.8E308 之间的浮点数.
没必要再继续对着书本打了…要理解. page 207
将编程看作是一门艺术,而不单单是个技术。
敲打的英文字符是我的黑白琴键,
思维图纸画出的是我编写的五线谱。
当美妙的华章响起,现实通往二进制的大门即将被打开。
JSP内容复习
JSP的3个编译指令,7个动作指令,9个内置对象
三个编译指令(通知servlet引擎的处理消息,只在JSP转换成Servlet时起作用)
1.编译指令 page
page指令用户定义JSP页面中的全局属性,它的语法格式如下:
<%page
{language="java"}
{extends="package.class"}
{import="{package.class|package.*},..."}
{session="true | false"}
{buffer="none | 8kb | sizekb"}
{ false"}
{isThreadSafe="true | false"}
{info="text"}
{errorPage="relativeURL"}
{contentType="mimeType [;charset=characterSet]" | "text/html ; charset=ISO-8859-1"}
{isErrorPage="true | false"}
{pageEncoding="charset=characrerSet | ISO-8859-1"}
%>
page指令对整个页面有效,包括静态的包含文件,但page指令不能用于被动态包含的文件,例如使用<jsp:include>包含的文件。在一个JSP页面中可以使用多个page指令,但page指令中的属性只能出现一次(import属性除外)。
2、include指令
include指令用于在JSP页面中包含其他文件,它的语法格式如下:
<% include file="路径名">
include指令仅有一个属性file,其值为文件的相对路径。include指令包含的过程是静态的,包含的文件可以是JSP、HTML或者Inc文件等。
3、taglib指令
taglib指令允许用户使用标签库自定义新的标签,它的语法格式如下:
<% taglib uri="taglibURI" prefix="tabPrefix"%>
taglib指令中的uri属性用于根据标签的前缀对自定义的标签进行唯一的命名,其值可以食相对路径,就对路径或标签库描述文件。属性prefix制定了标签的前缀。
7个动作指令(客户端在请求时期动态被执行的,也就是说每次访问客户端都有可能重新执行)
动作指令与编译指令不间,编译指令是通知 Servlet 引擎的处理消息,而动作指令只是运行时的脚本动作。编译指令在将JSP 编译成 Servlet 时起作用:处理指令通常可替换成 Java脚本,是 JSP脚本的标准化写法。
JSP7 个 动作指令如下 :
jsp:forward: 执行页面转向,将请求的处理转发到下一个页面。
jsp:param: 用于传递参数,必须与其他支持参数曲标签一起使用。
jsp:include: 用于动态引入一个 JSP 页面。
jsp:p1ugin: 用于下载 JavaBean 或 Applet 到客户端执行。
jsp:useBean: 使用 JavaBean。
jsp:setProperty: 修改 JavaBean 实例的属性值。
jsp:getProperty: 获取 JavaBean 实例的属性值。
下面依次讲解这些动作指令。
1.jsp:forward动作 (拿目标页面代替原有页面)
jsp:forward动作把请求转到另外的页面。可以转发静态的HTML页面,也可以转发动态的JSP页面,或者转发到容器中的servlet jsp:forward标记只有一个属性page。 page属性包含的是一个相对URL。 page的值既可以直接给出,也可以在请求的时候动态计算, 如下面的例子所示: 此页面在转发时增加恶劣一个参数 参数名为 age 值为 29;
<!--request.getParamenter("age"-->
获得上个页面传个来的参数值
2.jsp:include动作 (拿目标页面插入原有页面)
该动作是一个动态的include指令,也用于带入某个页面,他不会导入被include页面的编译指令,仅仅导入页面的body内容插入到本页面 该动作把指定文件插入正在生成的页面。其语法如下: flush:用于指定输出缓存是否转移到被导入的文件中, true:包含在被导入的文件中 false:包含在源文件中 前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。jsp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。 例如,下面的JSP页面把4则新闻摘要插入一个“What''s New ?”页面。改变新闻摘要时只需改变这四个文件,而主JSP页面却可以不作修改:
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
3..jsp:useBean动作
useBean:用于在jsp页面中初始化一个java实例(如果多个jsp中需要重复使用某段代码,可以把这段代码定义成java类在页面中引用)
jsp:useBean动作用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。
jsp:useBean动作最简单的语法为:<jsp:useBean id="JavaBean的名称" class="package.class"包名.类名" scope="有效范围"/>
这行代码的含义是:“创建一个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变量上”。不过,就象我们接下来会看到的,定义一个scope属性可以让Bean关联到更多的页面,它可接受四个值:request、session、page、application。此时,jsp:useBean动作只有在不存在同样id和scope的Bean时才创建新的对象实例,同时,获得现有Bean的引用就变得很有必要。
获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进行,也可以在Scriptlet中利用id属性所命名的对象变量,通过调用该对象的方法显式地修改其属性。这使我们想起,当我们说“某个Bean有一个类型为X的属性foo”时,就意味着“这个类有一个返回值类型为X的getFoo方法,还有一个setFoo方法以X类型的值为参数”。 有关jsp:setProperty动作的详细情况在后面讨论。但现在必须了解的是,我们既可以通过jsp:setProperty动作的value属性直接提供一个值,也可以通过param属性声明Bean的属性值来自指定的请求参数,还可以列出Bean属性表明它的值应该来自请求参数中的同名变量。
在JSP表达式或Scriptlet中读取Bean属性通过调用相应的getXXX方法实现,或者更一般地,使用jsp:getProperty动作。
注意,包含Bean的类文件应该放到服务器正式存放Java类的目录下,而不是保留给修改后能够自动装载的类的目录。例如,对于Java Web Server来说,Bean和所有Bean用到的类都应该放入classes目录,或者封装进jar文件后放入lib目录,但不应该放到servlets下。 id:javaBean的实例名 class: javaBean的实现类 scope:指定javaBean实例的生存范围 page:javaBean仅在该页面有效 request:javaBean在本次请求中有效 session: javaBean在本次session内有效 application: javaBean在本应用内一直有效 下面是一个很简单的例子,它的功能是装载一个Bean,然后设置/读取它的message属性。
3.1关于jsp:useBean的进一步说明
使用Bean最简单的方法是先用下面的代码装载Bean:
<jsp:useBean id="name" class="package.class" />
然后通过jsp:setProperty和jsp:getProperty修改和提取Bean的属性。
不过有两点必须注意。
第一,我们还可以用下面这种格式实例化Bean:
<jsp:useBean ...>
Body
</jsp:useBean>
它的意思是,只有当第一次实例化Bean时才执行Body部分,如果是利用现有的Bean实例则不执行Body部分。正如下面将要介绍的,jsp:useBean并非总是意味着创建一个新的Bean实例。
第二,除了id和class外,jsp:useBean还有其他三个属性,即:scope、type、beanName。
id:命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。
class:指定Bean的完整包名。
scope:指定Bean在哪种上下文内可用,可以取下面的四个值之一:page、request、session和application。 默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。
request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
session表示该Bean对当前HttpSession内的所有页面都有效。
最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效。
scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;
如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
type:指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。
beanName:指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。
4.jsp:setProperty动作
jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,如下所示: ... 此时,不管jsp:useBean是找到了一个现有的Bean,还是新创建了一个Bean实例,jsp:setProperty都会执行。第二种用法是把jsp:setProperty放入jsp:useBean元素的内部,如下所示: ... 此时,jsp:setProperty只有在新建Bean实例时才会执行,如果是使用现有实例则不执行jsp:setProperty。 jsp:setProperty动作有下面四个属性:name:表示要设置属性的是哪个Bean。 property:表示要设置哪个属性。有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。 value:value属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如“true”)通过Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。 value和param不能同时使用,但可以使用其中任意一个。 Param:param是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。 例如,下面的代码片断表示:如果存在numItems请求参数的话,把numberOfItems属性的值设置为请求参数numItems的值;否则什么也不做。 如果同时省略value和param,其效果相当于提供一个param且其值等于property的值。进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想,你还可以在property(Bean属性的名字)中指定“*”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则自动赋值。 下面是一个利用JavaBean计算素数的例子。如果请求中有一个numDigits参数,则该值被传递给Bean的numDigits属性;numPrimes也类似。 JspPrimes.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>在JSP中使用JavaBean</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
在JSP中使用JavaBean</TABLE>
</CENTER>
<P>
<jsp:useBean id="primeTable" class="hall.NumberedPrimes" />
<jsp:setProperty name="primeTable" property="numDigits" />
<jsp:setProperty name="primeTable" property="numPrimes" />
Some <jsp:getProperty name="primeTable" property= "numDigits" />
digit primes:
<jsp:getProperty name="primeTable" property="numbered List" />
</BODY>
</HTML>
5.jsp:getProperty动作
jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。jsp:getProperty有两个必需的属性,即:name,表示Bean的名字;property,表示要提取哪个属性的值。下面是一个例子,更多的例子可以在前文找到。 ...
<jsp:useBean id="itemBean" ... />
...
<UL>
<LI>Number of items:
<jsp:getProperty name="itemBean" property="numItems" />
<LI>Cost of each:
<jsp:getProperty name="itemBean" property="unitCost" />
</UL>
6.jsp:plugin动作 (用于下载服务器端的javaBean或applet到客户端)
jsp:plugin动作用来根据浏览器的类型,插入通过Java插件运行Java Applet所必需的OBJECT或EMBED元素。
<jsp:plugin
type="bean | applet" : 被执行的java程序的类型
code="classFileName" :被执行的文件名,必须以 .class 结尾
codebase="classFileDirectoryName" :被执行文件的所在目录
[ name="instanceName" ] :给程序起一个名字用来标识该程序
[ archive="URIToArchive, ..." ] :指向一些要预先载入的将要使用到的类
[ align="bottom | top | middle | left | right" ] :
[ height="displayPixels" ]
[ width="displayPixels" ]
[ hspace="leftRightPixels" ]
[ vspace="topBottomPixels" ]
[ jreversion="JREVersionNumber | 1.1" ] :能正确运行改程序必须的JRE的版本
[ nspluginurl="URLToPlugin" ]
[ iepluginurl="URLToPlugin" ] >
[ <jsp:params>
[ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+
</jsp:params> ]
[ <jsp:fallback> text message for user </jsp:fallback> ] :当不能正确显示该Applet时,显示该指令中的文本提示
<jsp:plugin>
7.jsp:param 用于设定参数值,
这个指令不能单独使用 可以与以下三个指令结合使用:
jsp:include :用于将参数值出入被导入页面
jsp:forword : 用于将参数值传入被转向页面
jsp:plugin : 用于将参数值传入页面中javaBean的实例
9个内置对象
JSP中的内置对象(9个)
对象名 对象的类型 范围
pageContext Javax.servlet.jsp.PageContext Page
page Javax.servlet.jsp.HttpJspPage Page
request Javasx.servlet.jsp.HttpServletRequest Request
response Javax.servlet.jsp.HttpServletResponse Page
session Javax.servlet.HttpSessio Session
application Javax.servlet.ServletContext Application
out Javax.servlet.jsp.JspWriter Page
config Javax.servlet.ServletConfig Page
exception Java.lang.ThrowAble page
内置对象是不需要声明,直接可以在JSP中使用的对象,JSP有以下几种内置对象:
1.request对象
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
1 Object getAttribute(String name) 返回指定属性的属性值,该属性不存在时返回null。
2 Enumeration getAttributeNames() 返回所有可用属性名的枚举
3 String getAuthType() ;返回用来保护servlet的认证方法的名称,未受保护时返回null。
4 String getCharacterEncoding() 返回字符编码方式
5 int getContentLength() 返回请求体的长度(以字节数),不能确定长度时返回-1。
6 String getContentType() 得到请求体的MIME类型
7 String getContentPath() 返回请求的路径。
8 Cookie[] getCookies() 返回客户端所有的Cookie的数组。
9 Enumeration getHeaderNames() 返回所有HTTP头的名称的集合。
10 Enumeration getHeaders( String name ) 返回指定HTTP头的所有值的集合。
11 String getHeader( String name ) 返回指定名称的HTTP头的信息。
12 long getDateHeader( String name ) 返回指定名称的Data类型的HTTP头的信息。
13 int getIntHeader( String name ) 返回指定名称的Int类型的HTTP头的信息。
14 ServletInputStream getInputStream() 得到请求体中一行的二进制流
15 Locale getLocale() 返回当前页的Locale对象,可以在response中设定。
16 Enumeration getLocales() 返回请求中所有的Locale对象的集合。
17 String getLocalName() 获取响应请求的服务器端主机名。
18 String getLocalAddr() 获取响应请求的服务器端地址。
19 int getLocalPort() 获取响应请求的服务器端端口
20 String getMethod() 获取客户端向服务器端发送请求的方法(GET、POST)。
21 String getParameter(String name) 返回name指定参数的参数值
22 Map getParameterMap() 该方法返回包含请求中所有参数的一个Map对象。
23 Enumeration getParameterNames() 返回请求中所有参数的集合。
24 String[] getParameterValues(String name) 返回包含参数name的所有值的数组
25 String getQueryString() 返回get方法传递的参数字符串,该方法不分解出单独的参数。
26 String getPathInfo() 取出请求中处于ServletPath和QueryString之间的额外信息。
27 String getPathTranslated() 返回用getPathInfo()方法取得的路径信息的实际路径。
28 String getProtocol() 返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。
29 BufferedReader getReader() 返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。
30 String getRemoteAddr() 返回发送此请求的客户端IP地址
31 String getRemoteHost() 返回发送此请求的客户端主机名
32 String getRemoteUser() 返回经过客户端验证的用户名,未经验证返回null。
33 int getRemotePort() 返回发出请求的客户端主机端口。
34 String getRealPath(String path) 返回一虚拟路径的真实路径
35 RequestDispatcher getRequestDispatcher( String path ) 按给定的路径生成资源转向处理适配器对象。
36 String getRequestedSessionId() 返回请求的session的标识。
37 String RequestURI() 返回发出请求的客户端地址,但是不包括请求的参数字符串。
38 StringBuffer getRequestURI() 返回响应请求的服务器端地址
39 String getScheme() 返回请求用的计划名,如:http.https及ftp等
40 String getServerName() 返回响应请求的服务器名称。
41 String getServletPath() 获取客户端所请求的脚本文件的文件路径。
42 int getServerPort() 返回服务器接受此请求所用的端口号
43. void removeAttribute( String name ) 在属性列表中删除指定名称的属性。
44. void setAttribute( String name, Object value ) 在属性列表中添加/删除指定的属性。
45. void setCharacterEncoding( String name ) 设置请求的字符编码格式。
46. HttpSession getSession() ;
HttpSession getSession( boolean create ) 获取session,如果create为true,在无session的情况下创建一个。
47. boolean isRequestedSessionIdFromCookie() 检查请求的会话ID是否为通过Cookie传入。
48. boolean isRequestedSessionIdFromURL() 检查请求的会话ID是否为通过URL传入。
49. boolean isRequestedSessionIdValid() 检查请求的会话ID是否仍然有效。
50. boolean isSecure() 检查请求是否使用安全链接,如果HTTPS等。
51. boolean isUserInRole( String role ) 检查已经通过验证的用户是否在是role所指定的角色。
52. Principal getUserPrincipal() 返回包含用户登陆名的一个java.security.Principal对象。
成员:
String BASIC_AUTH = "BASIC"
String CLIENT_CERT_AUTH = "CLIENT_CERT"
String DIGEST_AUTH = "DIGEST"
String FORM_AUTH = "FORM"
2.response对象 response
表示HttpServletResponse对象,主要将JSP容器处理后的结果传回到客户端。
1 void addCookie( Cookie cookie ) 添加一个Cookie对象,保存客户端信息。
2 void addDateHeader( String name, long value ) 添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息。
3 void addHeader( String name, String value ) 添加一个HTTP头,覆盖同名的旧HTTP头。
4 void addIntHeader( String name, int value ) 添加一个整型的HTTP头,覆盖同名的旧HTTP头。
5 boolean containsHeader( String name ) 判断指定的HTTP头是否存在。
6 String encodeRedirectURL( String url ) 对sendRedirect()方法使用的URL进行编码。
7 String encodeURL( String url ) 将URL予以编码,回传包含session ID的URL。
8 void flushBuffer() 强制把当前缓冲区的内容发送到客户端。
9 int getBufferSize() 取得以kb为单位的缓冲区大小。
10 String getCharacterEncoding() 获取响应的字符编码格式。
11 String getContentType() 获取响应的类型。
12 Locale getLocale() 获取响应的Locale对象。
13 ServletOutputStream getOutputStream() 返回客户端的输出流对象。
14 PrintWriter getWriter() 获取输出流对应的writer对象。
15 boolean isCommitted() 判断服务器端是否已经将数据输出到客户端。
16 void reset() 清空buffer中的所有内容。
17 void resetBuffer() 情况buffer中所有的内容,但是保留HTTP头和状态信息。
18 void sendError( int xc, String msg )
void sendError( int xc ) 发送错误,包括状态码和错误信息。
19 void sendRedirect( String locationg ) 把响应发送到另外一个位置进行处理。
20 void setBufferSize( int size ) 设置以kb为单位的缓冲区大小。
21 void setCharacterEncoding( String charset )设置响应使用的字符编码格式。
22 void setContentLength( int length ) 设置响应的BODY长度。
23 void setContentType( String type ) 设置响应的类型。
24 void setDateHeader( String name, long value ) 设置指定名称的Data类型的HTTP头的值。
25 void setHeader( String name, String value ) 设置指定名称的HTTP头的值。
26 void setIntHeader( String name, int value ) 设置指定名称的int类型的HTTP头的值。
27 void setStatus( int xc ) 设置响应状态码,新值会覆盖当前值。
成员(HTTP状态码):
int SC_CONTINUE = 100 int SC_SWITCHING_PROTOCOLS = 101
int SC_OK = 200 int SC_NON_AUTHORITATIVE_INFORMATION = 203
int SC_ACCEPTED = 202 int SC_CREATED = 201
int SC_NO_CONTENT = 204 int SC_RESET_CONTENT = 205
int SC_PARTIAL_CONTENT = 206 int SC_MULTIPLE_CHOICES = 300
int SC_MOVED_PERMANENTLY = 301 int SC_MOVED_TEMPORARILY = 302
int SC_FOUND = 302 int SC_SEE_OTHER = 303
int SC_NOT_MODIFIED = 304 int SC_USE_PROXY = 305
int SC_TEMPORARY_REDIRECT = 307 int SC_BAD_REQUEST = 400
int SC_UNAUTHORIZED = 401 int SC_PAYMENT_REQUIRED = 402
int SC_FORBIDDEN = 403 int SC_NOT_FOUND = 404
int SC_METHOD_NOT_ALLOWED = 405 int SC_NOT_ACCEPTABLE
3.session对象
session表示一个请求的javax.servlet.http.HttpSession对象。指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。
1 long getCreationTime() 返回SESSION创建时间
2 public String getId() 返回SESSION创建时JSP引擎为它设的惟一ID号
3 long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间
4 int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms)
5 String[] getValueNames() 返回一个包含此SESSION中所有可用属性的数组
6 void invalidate() 取消SESSION,使SESSION不可用
7 boolean isNew() 返回服务器创建的一个SESSION,客户端是否已经加入
8 void removeValue(String name) 删除SESSION中指定的属性
9 void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms)
4.out对象
out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
1 void clear() 清除缓冲区的内容,但是不输出到客户端。
2 void clearBuffer() 清除缓冲区的当前内容,并输出到客户端。
3 void close() 关闭输出流,清除所有内容。
4 void flush() 输出缓冲区里面的数据。
5 int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
6 int getRemaining() 返回缓冲区还剩余多少可用
7 boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
8. void newLine() 输出一个换行字符。
9. void print( boolean b ) 将指定类型的数据输出到Http流,不换行
10. void println( boolean b ) 将指定类型的数据输出到Http流,并输出一个换行符。
11.
Appendable append( char c )
Appendable append( CharSequence cxq, int start, int end )
Appendable append( CharSequence cxq )
将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。
成员:
int DEFAULT_BUFFER = 0 - 缺省缓冲区大小
int NO_BUFFER = -1 - writer是否处于缓冲输出状态
int UNBOUNDED_BUFFER = -2 - 是否限制缓冲区大小
5.page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
1 class getClass 返回此Object的类
2 int hashCode() 返回此Object的hash码
3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等
4 void copy(Object obj) 把此Object拷贝到指定的Object对象中
5 Object clone() 克隆此Object对象
6 String toString() 把此Object对象转换成String类的对象
7 void notify() 唤醒一个等待的线程
8 void notifyAll() 唤醒所有等待的线程
9 void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒
10 void wait() 使一个线程处于等待直到被唤醒
11 void enterMonitor() 对Object加锁
12 void exitMonitor() 对Object开锁
6.application对象
applicaton 表示一个javax.servlet.ServletContext对象。他实现了用户间数据的共享,可存放全局变量。它
开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之
间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的
访问。服务器的启动和关闭决定了application对象的生命。
1 Object getAttribute(String name) 返回给定名的属性值
2 Enumeration getAttributeNames() 返回所有可用属性名的枚举
3 void setAttribute(String name,Object obj) 设定属性的属性值
4 void removeAttribute(String name) 删除一属性及其属性值
5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本号
6 String getRealPath(String path) 返回一虚拟路径的真实路径
7 ServletContext getContext(String uripath) 返回指定WebApplication的application对象
8 int getMajorVersion() 返回服务器支持的Servlet API的最大版本号
9 int getMinorVersion() 返回服务器支持的Servlet API的最大版本号
10 String getMimeType(String file) 返回指定文件的MIME类型
11 URL getResource(String path) 返回指定资源(文件及目录)的URL路径
12 InputStream getResourceAsStream(String path) 返回指定资源的输入流
13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象
14 Servlet getServlet(String name) 返回指定名的Servlet
15 Enumeration getServlets() 返回所有Servlet的枚举
16 Enumeration getServletNames() 返回所有Servlet名的枚举
17 void log(String msg) 把指定消息写入Servlet的日志文件
18 void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件
19 void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的
日志文件。
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应
用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象。
8.pageContext对象
pageContext表示一个javax.servlet.jsp.PageContext对象。pageContext对象提供了对JSP页面内所有的对象及
名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值
。
1 JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)
2 HttpSession getSession() 返回当前页中的HttpSession对象(session)
3 Object getPage() 返回当前页的Object对象(page)
4 ServletRequest getRequest() 返回当前页的ServletRequest对象(request)
5 ServletResponse getResponse() 返回当前页的ServletResponse对象(response)
6 Exception getException() 返回当前页的Exception对象(exception)
7 ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config)
8 ServletContext getServletContext() 返回当前页的ServletContext对象(application)
9 void setAttribute(String name,Object attribute) 设置属性及属性值
10 void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值
11 public Object getAttribute(String name) 取属性的值
12 Object getAttribute(String name,int scope) 在指定范围内取属性的值
13 public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL
14 void removeAttribute(String name) 删除某属性
15 void removeAttribute(String name,int scope) 在指定范围删除某属性
16 int getAttributeScope(String name) 返回某属性的作用范围
17 Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举
18 void release() 释放pageContext所占用的资源
19 void forward(String relativeUrlPath) 使当前页面重导到另一页面
20 void include(String relativeUrlPath) 在当前位置包含另一文件
9.config对象
config表示一个javax.servlet.ServletConfig对象。
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参
数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象。)
1 ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象
2 String getInitParameter(String name) 返回初始化参数的值
3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举
null