JSP最终必须编译成Servlet才能运行,或者说JSP只是Servlet的“草稿“文件。2.1 Web应用和web.xml文件<webDemo> |-WEB-INF | |-classed | |-lib | |-web.xml |-<a.jsp>----jsp页面web.xml:head<?xml version="1.0" encoding="GBK"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi=schemaLacation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"></web-app>servlet3.0规范中web.xml不再是必须的,简单看一下web.xml可以配置什么。1.配置JSP2.配置和管理Servlet3.配置和管理Listener4.配置和管理Filter5.配置标签库6.配置JSP属性7.配置和管理JAAS授权认证8.配置和管理资源引用9.Web应用首页10.metadata-complete:配置是否加载Annotation配置的Web组件2.2 JSP的基本原理JSP页面由两部分组成:>静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同。>动态部分:受Java程序控制的内容,这些由Java程序动态生成ex:<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %><html xmlns="www.w3.org/1999/xhtml"><head><title>第一个JSP页面</title></head><body><!--下面是java脚本--><%for(int i=0; i<7; i++){ out.println("<font size='"+i+"'>");%>Wild java Camp</font><br/><%}%></body></html>2.3 JSP注释<%-- JSP注释内容 --><!-- HTML注释内容 -->HTML注释可以通过源代码查看到,但是JSP注释不能。2.4 JSP声明<%! 声明部分 %>对应于Servlet类的成员变量和方法。每个Servlet在容器中只有一个实例,所有客户端共享这一个实例。2.5 输出JSP表达式<%= 表达式 %>代替out.println输出语句2.6 JSP脚本<% JSP脚本 %>对应于Servlet中_jspService()方法的一部分。2.7 JSP的3个编译指令>page:该指令是针对当前页面的指令>include:用于指定包含另一个页面>taglib:用于定义和访问自定义标签2.7.1 page指令一个JSP页面可以使用多条page指令。格式:<%@page[language="Java"][extends="package.class"] -->父类[import="package.class|package.*,..."] -->导入包[session="true|false"][buffer="none|8KB|size KB][autoFlush="true|false"][isThreadSafe="true|false"][info="text"] -->可以通过Servlet.getServletInfo()获取[errorPage="relativeURL"] //JSP的异常处理机制[contentType="mimeType[;charset=characterSet]"| "text/html;charSet=ISO-8859-1"][pageEncoding="ISO-8859-1"][isErrorPage="true|false"]%>2.7.2 include指令include既可以包含静态的文本,也可以包含动态的JSP页面。<%@include file="relativeURLSpec"%>静态包含还会将被包含页面的编译指令也包含进来,如果两个页面的编译指令冲突,那么页面就会出错。2.8 JSP的7个动作指令>jsp:forward:执行页面转向,将请求的处理转发到下一个页面>jsp:param:用于传递参数,必须与其他支持参数的标签一起使用>jsp:include:用于动态引入一个JSP页面>jsp:plugin:用于下载JavaBean或Applet到客户端执行>jsp:useBean:创建一个JavaBean的实例>jsp:setProperty:设置JavaBean实例的属性值>jsp:getProperty:输出JavaBean实例的属性值2.8.1 forward指令<jsp:forward page="{relativeURL|<%=expression%>}"/>可带jsp:param参数执行forward时不会丢失请求参数用户请求依旧是一次请求2.8.2 include指令<jsp:include page="{relativeURL|<%=expression%>}" flush="true"> <jsp:param name="parameterName" value="parameterValue"/></jsp:include>flush属性指定输出缓存是否转移到被导入文件中。forward拿目标页面代替原有页面,而include则拿目标页面插入原有页面,都不改变URL。2.8.3 useBean,setProperty,getProperty指令<jsp:useBean id="name" class="classname" scope="page|request|session|application"/><jsp:setProperty name="BeanName" property="propertyName" value="value"/><jsp:getProperty name="BeanName" property="propertyName"/>除去scope,这3个指令就是初始化Java类,set方法,get方法。2.8.4 plugin指令2.8.5 param指令这个指令不能单独使用,主要用在include,forward,plugin之中2.9 JSP脚本中的9个内置对象application:ServletContext的实例,代表Web应用本身。config:ServletConfig实例,代表JSP的配置信息。exception:Throwable实例,代表其他页面中的异常和错误,只在错误处理页面处理。out:JspWrite实例,代表JSP页面的输出流。page:Servlet实例,就是thispageContext:PageContext实例,代表JSP页面的上下文,用来访问页面中的共享数据。request:HttpServletRequest实例,客户端的一次请求response:HttpServletResponse实例,代表服务器对客户端的响应。session:HttpSession实例代表一次会话。从建立连接到关闭浏览器。所有内置对象都是_jspService()的局部变量或者形参。2.9.1 application对象让多个JSP、Servlet共享数据application.setAttribute("counter", String.valueOf(++i));application.getAttribute("counter");or:ServletContext sc = getServletConfig().getServletContext();sc.getAttribute("counter");获取Web应用配置参数String driver = application.getInitParameter("driver");对应web.xml中:<context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value></context-param>2.9.2 config对象config对象代表当前JSP配置信息,但JSP页面通常无须配置,因此也就不存在配置信息。<%=config.getServletName()%><%=config.getInitParameter("name")%>配置JSP也在web.xml中进行,JSP被当作Servlet配置2.9.3 exception对象//异常处理结构try{ //普通页面}catch(Throwable exception){ //错误处理页面,exception对象}<%=exception.getClass()%><%=exception.getMessage()%>2.9.4 out对象使用out的地方,都可以使用输出表达式来代替2.9.5 pageContext对象使用pageContext可以访问page,request,session,applicaion范围的变量。getAttribute(String name);//page范围内的name属性getAttribute(String name, int scope);PageContext.PAGE_SCOPEPageContext.REQUEST_SCOPEPageContext.SESSION_SCOPEPageContext.APPLICATION_SCOPEgetRequest()getResponse()getServletConfig()getServletContext()getSession()2.9.6 request对象1.获取请求头/请求参数String getParameter(String paramName);Map getParameterMap();Enumeration getParameterNames();String[] getPrameterValues(String name);String getHeader(String name);Enumeration<String> getHeaderNames();Enumeration<String> getHeaders(String name);int getIntHeader(String name);对于简体中文,设置解码方式,使用gb2312解码request.setCharacterEncoding("gb2312");get方式处理非西欧字符:String rawQueryStr = request.getQueryString();String queryStr = java.net.URLDecoder.decode(rawQueryStr, "gbk");String[] queryStr.split("&");.....或者:String rawName = request.getParameter("name");byte[] rawbytes = rawName.getByte("ISO-8859-1");String name = new String(rawbytes, "gb2312");2.操作request范围的属性setAttribute(String attName, Object attValue);Object getAttribute(String attName);3.执行forward或者includegetRequestDispatcher("/a.jsp").include(request, response);getRequestDispatcher("/a.jsp").forward(request, response);2.9.7 response对象大部分时候,程序无须使用response来响应客户端请求,因为有个更简单的响应对象--out,它代表页面输出流。1.response响应生成非字符响应修改contentType2.重定向请求变了,不通于forwardresponse.sendRedirect("a.jsp");3.增加Cookievoid addCookie(Cookie cookie);ex:Cookie c = new Cookie("username", name);c.setMaxAge(24*3600);response.addCookie(c);request.getCookies()=>Cookie[]2.9.8 session对象setAttribute(String attName, Object attValue);getAttribute(String attname);session的属性值可以是任何可序列化的对象。