速成笔记:Java Server Pages

来源:互联网 发布:windows phone 8.1软件 编辑:程序博客网 时间:2024/05/16 05:30

笔记分为两个版本:

Java Server Pages笔记版本1

【常用】<%--  --%>jsp风格的注释
【注意】<%      %>在客户端的源文件中为一行   但是浏览器解释之后可能没有<br>换行
【注意】<%!     %>内部只能定义全局变量、方法、类,不能进行其他操作
【常用】表单form页面:向xxx.jsp传递参数
 <form action="xxx.jsp" method="post">
    输入要显示表格的行数:<input type="text" name="row"><br>
    输入要显示表格的列数:<input type="text" name="col"><br>
    <input type="submit" value="显示">
    <input type="reset" value="清空"><br>
  </form>
           作为form的action的jsp:接收form参数
 <%
   int rows=0;
   int cols=0;
   try{
    rows=Integer.parseInt(request.getParameter("row"));
    cols=Integer.parseInt(request.getParameter("col")); 
   }catch(Exception e){}   
   %>
【了解】MyEclipse的Preferences配置:
更改jsp的默认打开方式:   File Associations | *.jsp ->选择MyEclipse JSP Editor ->设置为Default
更改JREs的doc和src位置: Install JREs->Edit->Javadoc Location和Source Attachment为本地*.jar或*.zip或none
取消自动校验:                validation | 其他的都不选 除了Manual下面的一列复选框全选中
                                     手动校验->右键 | MyEclipse | Run Validation
【常用】page指令
<%@ page 属性="内容"%>
    属性 language="java"     开发语言
           contentType="text/html;charset=GBK" 指定MIME:按照HTML文本文件显示 页面编码GBK
                        pageEncoding 
                       
                        errorPage/isErrorPage 设置错误跳转页面/在错误处理页面设置为true 两个页面间为服务器跳转(地址栏不表)
                       
            import可以出现多次

                        isThreadSafe(单线程为false)

【注意】pageEncoding是Jsp自身的编码 contentType服务器发送给客户端的内容编码
编码优先级pageEncoding > contentType > 缺省ISO-8859-1
在JSP中所有内容都会经过两次编码操作:pageEncoding -> utf-8 -> contentType(Tomcat生成网页)
【了解】MIME:多功能Internet邮件扩充服务 指定某个扩展名文件将使用何种应用程序打开
1)查询tomcat安装目录/conf/web.xml中查询MIME类型
<mime-mapping>
 <extension>doc</extension>
 <mime-type>application/msword</mime-type>
</mime-mapping>
2)contentType="application/msword;charset=GBK" //使用word打开页面(下载该页面jsp名称为该word的文件名)
3)将该下载文件名改为指定文件名:response.setHeader("Content-Disposition","attachment;filename=myname.doc")
关于html和htm是同一个mime-type不同的extension 处理方式是一样的
【注意】errorPage/isErrorPage是在每一个JSP页面中指定 也可以在整个虚拟目录中指定全局的错误处理修改web.xml(服务器跳转)
<error-page>
 <error-code>500</error-code>
 <location>/myerror/error.jsp</location>
</error-page>
【了解】如果错误处理页面无法打开可以设置http状态码<% response.setStatus(200)%>
【常用】jsp连接数据库:将数据库驱动程序放入tomcat安装目录/lib下
<%@ page language="java" import="java.sql.*" %>
...
<table>
        <%
 Class.forName("oracle.jdbc.driver.OracleDriver");
 Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
 Statement stat = conn.createStatement();
 ResultSet rs = stat.executeQuery("select * from emp");  
 while(rs.next()){
        %>
 <tr>
  <td><%=rs.getString(1) %></td>
  <td><%=rs.getString(2) %></td>
 </tr>
       <%}%>
</table>
【常用】include包含指令
左侧工具栏|页面头部|具体内容|页面尾部:分别将工具栏 页面头部 页面尾部 分别做成一个文件 在需要的地方导入(包含)

静态包含:1)<%@include file="xxx.xxx"%>
                    不管文件后缀 直接将内容复制进来 作为一整页jsp向servlet转换 只产生一个class
 2)被包含页面和包含页面为同一个request

动态包含:1)<%jsp:include page="xxxx.xxx"/>或者<%jsp:include page="<%=表达式 %>"/>
      检查文件后缀 如果是动态文件 发生在编译class文件时期 会产生多个class
      可以传递参数在<%jsp:include>结点下<jsp:param name="参数名字" value="参数内容"/>向被包含页面传递多个参数
  2)被包含页面可以取到更大范围的参数:包含页面的request参数 和 包含页面中jsp:param的参数

【常用】forward跳转指令 同动态包含相似

【总结】三个指令: page include forward
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【重要】9个内置对象
request         javax.servlet.http.HttpServletRequest;     用户请求(ServletRequest接口的子接口实例化对象)
response       javax.servlet.http.HttpServletResponse;    服务器回应void sendRedirect(String)++void setHeader(String name,String value)++void addCookie(Cookie cookie)
session          javax.servlet.http.HttpSession;                保存每个用户信息String getId()同JSESSIONID中的内容 long getCreationTime()创建时间(ms) long getLastAccessedTime()最后一次操作时间 boolean isNew() void invalidate()是Session失效

out               javax.servlet.jsp.JspWriter                       页面输出getBufferSize()获取缓冲区大小 getRemaining()查看未使用的缓冲区大小
pageContext  javax.servlet.jsp.PageContext                  JSP页面容器可以取得application config session/ request response父类接口对象 /页面forward跳转 页面Include包含

application     javax.servlet.ServletContext;                    保存所有用户共享信息 在jsp中尽量多使用this.getServletContext()代替
config           javax.servlet.ServletConfig;                       服务器配置(初始化参数)String getInitParameter(String name)++Enumeration getInitParameterNames()++ServletContext getServletContext()++String getServletName()

page             java.lang.Object;                                    当前页面表示出来的Servlet实例
exception      java.lang.Throwable;                               JSP页面所发生异常
【重要】4种属性范围:一个内置对象可以在多少个页面中保存并使用
page属性            只在一个页面中保存属性 服务器跳转至后无效
request属性        只在一次请求中保存  服务器跳转后依然有效(url地址不变 forward) 客户端跳转无效(url地址改变了redirect)
session属性         再一次会话范围中 无论何种跳转都可以使用 但在新开浏览器无法使用(每一个新浏览器都是一个新session)
application属性    在整个服务器上保存 所有用户都可以使用(在多个浏览器中仍可以访问:设置过多影响服务器性能) 当服务器重启时会消失


对应的属性操作方法:public setAttribute(String name,Object o)
                              public Object getAttribute(String name)   //注意类型的强制转换
    public void removeAttribute(String name)
【注意】page属性使用pageContext内置对象
有四个常量:PAGE_SCOPE   REQUEST_SCOPE   SESSION_SCOPE   APPLICATION_SCOPE用于指定int scope
有方法:public void setAttribute(String name,Object value,int scope)//设置属性 并制定保存范围
【重要】request对象

++设置请求编码:浏览器默认UTF-8(中文GBK问题)form表单提交-->action接受request的参数设为GBK编码 【重要】 最好在每个JSP页面都加上设置//可以使用过滤器来代替每个页面上设置--请求编码
void setCharacterEncoding(String env) throws UnsupportedEncodingException

++得到客户端的地址
String getRemoteAddr()  //ip地址                                     StringBuffer getRequestURL()  //请求路径 --/工程名/.../文件名
String getServletPath()   //取得访问路径--基于工程名的路径  String getContextPath()  //取得上下文资源路径--/工程名

++获取(全部)请求参数
根据名字取信息: String            getParameter(String name)           getHeader(String name)
取全部请求名称:Enumeration   getParameterNames()                    getHeaderNames()  --取出全部头信息名字
根据名字取信息:String[]          getParameterValues(String name)   getHeaders(String name)   
 --针对复选框控件:同一个名字name多个值value的情况 控件属性name="**XXXXX" 以**开头用于区分获取方法
【重要】多个参数的存取
Enumeration enu = request.getParameterNames();
while(enu.hasMoreElements()){
 Striong paramName =(String)enu.nextElement();
 if(paramName.startsWith("**")){
  String paramValue[]=request.getParameterValues(paramName);
  for(int x=0;x<paramValue.length;x++){
   //....
  }
 }else{
  String paramValue=request.getParameter(paramName);
   //.....
 }
}
++角色验证:request.isUserInRole();
tomcat安装目录/conf/tomcat-users.xml
<tomcat-users>
 <user username="admin" password="admin" roles="admin"/>
</tomcat-users>
在web.xml设置某一资源的验证操作
<security-constraint>
  <web-resource-collection>                                    <!-- 定义限制访问的资源 -->
   <web-resource-name>RegisteredUsers</web-resource-name>   <!-- 限制访问的名称 -->
   <url-pattern>MySafe.jsp</url-pattern>                    <!-- 限制访问的路径 -->
  </web-resource-collection>
  <auth-constraint>                                            <!-- 定义访问此限制资源的角色 -->
   <role-name>admin</role-name>                             <!-- admin角色可以访问 -->
  </auth-constraint>
  </security-constraint>
  <login-config>            <!-- 指定所使用的验证方法 -->
   <auth-method>BASIC</auth-method>       <!-- 通过弹出登陆窗口提示 -->
   <realm-name>RegisterUsers</realm-name>      <!-- 验证中使用的领域名称 -->
  </login-config>
  <security-role>            <!-- 指定用于安全约束中安全角色的声明 -->
   <role-name>admin</role-name>
  </security-role>
验证页面使用
if(request.isUserInRole("admin")){//验证admin角色
}
【了解】response.setHeader("refresh","3;URL=xxx.jsp");3s后刷新并跳转到xxx.jsp (客户端跳转)
            <META HTTP-EQUIV="refresh" CONTENT="3;URL=xxxx.jsp">
【了解】javax.servlet.http.Cookie的类
//设置Cookie
Cookie username = new Cookie("username","aaa");     Cookie password = new Cookie("password","bbb");
username.setMaxAge(60);                                        password.setMaxAge(60);   //当浏览器关闭 在客户端硬盘文件保留60s
response.addCookie(username);                                response.addCookie(password);
//取出Cookie
Cookie c[] = request.getCookies();
c[i].getName()-------c[i].getValue()
//关于JSESSION对象
//系统自动设置:服务器为了明确区分每一个客户端自动设置JSESSION
//一般一个客户端最多保留300个cookie
【重要】登录和注销
在登陆页面设置用户ID属性到Session中:session.setAttribute("userID","xxxx");
在展示页面session.getAttribute("userID")判断是否为null
在注销页面session.invalidate()并使用response.setHeader("refresh","3,URL="xxx.xxx"")跳转
【重要】四种会话跟踪技术
通过session  通过cookie 通过表单的隐藏域 通过地址重写的方式保存信息
【重要】获取对象
                 Servlet接口:ServletConfig getServletConfig()          //  获取ServletConfig对象  config
         ServletConfig接口: ServletContext getServletContext()    //  获取ServletContext对象 application
HttpServletRequest接口:HttpSession getSession()                    //  获取当前session对象      session
【了解】WEB-INF的目录外界不可见 安全性最高
【重要】获取初始化参数config.getInitParameter(String name)
在web.xml中配置
  <servlet>
   <servlet-name>init</servlet-name>
   <jsp-file>/WEB_INF/init.jsp</jsp-file>
   <init-param>
    <param-name>username</param-name>
    <param-value>admin</param-value>
 </init-param>
  </servlet>
  <servlet-mapping>
   <servlet-name>init</servlet-name>
   <url-pattern>/config.init</url-pattern>
  </servlet-mapping>


【重要】javaBean中至少要存在一个无参构造方法为JSP标签所用:采用反射机制的要求
<jsp:useBean class="包.类名" id="对象名" scope="page"/>

<jsp:setProperty name="对象名" property="*"/>                 自动匹配(自省机制) --> 对象名.setXxx(request.getParameter("xxx"));
<jsp:setProperty name="对象名" property="属性名称aa"/>    同名匹配:        请求中的参数aa与javaBean中对象的属性aa匹配
<jsp:setProperty name="对象名" property="属性名称" value="内容"/>    忽略请求参数:  可以直接制定内容
<jsp:setProperty name="对象名" property="属性名称aa" param="参数名称bb"/> 不同名匹配:     请求中的参数bb与javaBean中对象的属性aa匹配

<jsp:getProperty name="对象名" property="属性名称aa"/>
pojo(Plain Ordinary Java Object)简单java对象 vo(value object)与简单Java对象对应 用于传递值操作 TO(Transfers Object)传输对象 进行远程传输时 对象所在的类必须实现java.io.Serializable接口
打包编译好的javaBean.class文件放入WEB-INF\classes文件夹中(包括了class的包路径文件夹)

删除javaBean:按照scope的范围调用 相应的内置对象removeAttribute("javaBean的id")

【重要】servlet生命周期
javax.servlet
Interface Servlet

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence:
1.The servlet is constructed, then initialized with the init method.
2.Any calls from clients to the service method are handled.
3.The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.

 void init(ServletConfig config)
          Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
 void service(ServletRequest req, ServletResponse res)
          Called by the servlet container to allow the servlet to respond to a request.
 void destroy()
          Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.

 ServletConfig getServletConfig()
          Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.

 

 

 

 

Java Server Pages笔记版本2

1.直接在HTML中内嵌JSP代码<%  java servlet 代码 %>

JSP程序由JSP Engine先将它转换成Servlet代码,接着将它编译成类文件载入执行。

只有当客户端第一次请求JSP时,才需要将其转换、编译

Tomcat中的work/catalina/localhost/xxx/org/apache/jsp/被转换为servlet代码和对应*.class

2.优点

优良的性能:优于CGI,PHP,ASP平台无关性:操作系统无关,Web服务器无关可扩展性:tag的扩展机制,简化页面开发

3.JSP语法:传统语法、JSTL、JSF //JSTL和JSF为tag语法(不常用)

Declaration:<%!  声明的变量、定义方法%> 会被保留成唯一的一份,直到JSP程序停止(全局变量)

Scriptlet:    <%  程序代码区        %>   可以放入任何的Java程序代码Expression: <%=  字符串变量或者可以被转换成字符串的表达式  %>  (不加分号结束且只有一行)Comment:  <%-- --%><% /* */%><%// %>(html的注释<!-- -->无法阻止<%%>的执行)Directives:  <%@Directive 属性=“属性值”%> 相当于在编译期间的命令jsp->servlet 

Page:  指明与JSP Container 的沟通方式

<%@page language=“java”| extends=“className”|      buffer=“none|kb size”| //none:不缓冲,默认8k提高<%= %>效率     session=“true|false”|  //是否可以使用session,默认true   autoFlush=“true|false”|  //缓冲器是否自动清除,默认true     isThreadSafe=“true|false”|  --默认false(永远不要设成true:排队)         info=“infoText”|    --任何字符

import=“java.util.*”| //导入包errorPage=“ErrPage.jsp”|  //当前页面出错跳转到ErrPage.jsp 处理isErrorPage=“true|false”|  //在ErrPage.jsp 中设为true设为true即可访问exception内置对象

//在ErrPage.jsp 中使用 <%= exception.getMessage()%>

contentType=“text/html”|  //解决乱码

pageEncoding=“gb2312”%>include:<@ include file=”test.jsp”>(编译时不能包含参数:只有运行时才能传参数)

//作为同一个request对象

//字符集要统一contentType=“text/html” ;pageEncoding=“gb2312”

taglib

Action动作指令:在运行期间的命令

①jsp:useBean:见javaBean部分

②jsp:include:< jsp:include page=”data.jsp” flush=”true”> </ jsp:include>

//动态包含:编译为两个文件(只有执行到对应代码时才编译另一个文件)

//分别为两个request对象 但可以看做一个对象//可以包含参数

③jsp:param用来设定include文件或forward转向页面时的参数和对应的值

<jsp:include page=“test.java” flush=“true”> <jsp:param name=“ParamName” value=“paramValue”/></jsp:include>

<jsp:forward page=“urlSpec”> <jsp:param name=“paramName” value=“paramValue”/></jsp:forward>

④jsp:forward:和sendRedirect的转向区别

<%response. sendRedirect(“a.jsp”);%>相当于在浏览器的地址栏手工录入a.jsp点转到

//服务器让浏览器地址栏改变再转到 服务器再提供相应页面 也可以转到其他URL

//不会阻止当期jsp后面代码运行 当期页面不能传参给转向页面

<jsp:forward page=”a.jsp”/>

Sendredirect

Forward

是不同的request

不同的对象,但可取到上一个页面的内容

send后的语句会继续执行,除非return

forward后的语句不会继续发送给客户端

速度慢

速度快

需要到客户端的往返,可以转到任何页面

服务器内部转换,

地址栏有变化

地址栏没有变化

可以传参数,直接写在url后面

可以传参数

常用

常用

this.getServletContext().getRequestDispatcher ("/a.jsp").forward(req, resp);

并且只能以/开头 代表webapp的根路径

⑤jsp:plugin:嵌入applet

内置对象:   由系统已经调用配置 在jsp中不用声明可以直接使用

out request response session application Exception pageContext config page

4. JSP中的服务器端代码和客户端代码能互相调用:(可以嵌入html和js中)使用<%out.print(str)%>

JavaBean

1.// Bean的基本要素: ========= bean\ CounterBean.java =================

package bean;              // jsp调用javabean的时候不允许用裸体类

import java.io.Serializable;

public class CounterBean implements java.io.Serializable{

  private int count = 0;    //Bean类应该没有任何公共实例变量(变量名称首字母必需小写)

  public CounterBean()  { }  //必须要有一个不带参数的构造器(在JSP元素创建Bean时调用)

  public int getCount() { count++; return count; }  //通过getter方法来读变量的值

  public void setCount(int c) { count=c; }       //通过setter方法来写变量的值

}

2. jsp调用javabean的两种风格:java语句/标签语句通过jsp:useBean,可以在JSP中使用定义好的Bean

CounterBean cb = new CounterBean();

< jsp:useBean  id=”cb” class=”bean.CounterBean”></ jsp:useBean>

cb.setCount(Integer.parseInt("23"))

<jsp:setProperty name=”cb” property=”count” value=”23”/>

out.print(cb.getCount())

<jsp:getProperty name=”cb” property=” count” />

3. jsp:useBean各项参数含义:

id/name:对象实例名称   property :setter/getter的方法名  value:写入变量的值class:Bean类名称(全名)type:Bean实例类型,可以是本类,或其父类,或实现的接口,默认为本类scope:Bean作用的范围,默认为page,对整个jsp页面有效

4.Scope各项参数的意义:

page:仅涵盖使用JavaBean的页面(默认)new方式,而非从“篮子“中取出request:有效范围仅限于使用JavaBean的请求 request.getAttribute(“bean类名“)session:有效范围在用户整个连接过程中(整个会话阶段均有效)session.getAttribute(“...“)application:有效范围涵盖整个应用程序。也就是对整个网站均有效

5.建立表单参数和Bean属性之间的关联通过param指定表单元素的名称,通过perperty指定对应的Bean属性名称,由此建立两个变量的关联

通过*来设置所有属性和输入参数之间的关联在建立Bean属性和表单参数之间对应关系时,服务器会将对应的参数自动转换成和属性类型匹配的数据

内置对象

1.out:一个缓冲的输出流,用来给客户端返回信息。它是javax.servlet.jsp.JspWriter的对象`

println():向客户端输出各种类型数据

newLine():输出一个换行符

getBufferSize():返回缓冲区的大小

close():关闭输出流                

clear():清除缓冲区里的数据,但不把数据输出到客户端

flush():输出缓冲区里的数据

clearBuffer():清除缓冲区里的数据,同时把数据输出到客户端

2.request:调用JSP页面的请求。request对象是javax.servlet.http.HttpServletRequest接口的实例

request.getParameter(“paramName”)可以获得Form提交过来的参数值

可以用此对象取得请求的Header、信息(如浏览器版本、语言和编码等)、请求的方式(get/post)、请求的参数名称、参数值、客户端的主机名称等常用方法:getMethod():返回客户端向服务器端传送数据的方法getParameter(String paramName):返回客户端向服务器端传送的参数值,该参数由paramName指定getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举类型数据(Enumeration)getParameterValues(String  name):获得指定参数的所有值,由name指定getRequestURI():获得发出请求字符串的客户端地址getRemoteAddr():获取客户端的IP地址getRemoteHost():获取客户端机器名称getServerName():获取服务器的名字getServletName():客户端所请求的脚本文件路径getServerPort():获取服务器端的端口

3.response :表示的是返回给客户端的响应.是javax.servlethttp.HttpServletResponse接口的一个实例经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL常用方法:addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定的信息addHeader(String name,String value):添加HTTP头信息,该Header信息将发送到客户端containsHeader(String name):判断指定名字的HTTP文件头是否存在sendError(int):向客户端发送错误的信息sendRedirect(String url):重定向JSP文件setContentType(String contentType):设置MIME类型与编码方式

4.session &5.application 

<% @page session=“true”%>(默认)--表示session功能已经在jsp页面中启动session常用方法:void setAttribute(String name,Object value) Object getAttribute(String name) boolean isNew()application -- ServletContext6.Exception  ErrPage.jsp中使用   7.pageContext    8.config    9.page 不常用

Servlet和JSP的通信

从JSP调用Servlet可用<jsp:forward>请求信息自动传递到Servlet或者通过sendRedirect从Servlet调用JSP使用RequestDispatcher接口的forward(req, res)方法,请求信息需要显式传递(在req、res参数中)或者通过sendRedirect

resp.sendRedirect(req.getContextPath()+”/ServletToJSP.jsp”);

req.setAttribute ("servletName", "ServletToJsp");

getServletConfig().getServletContext().getRequestDispatcher("/ServletUseJsp.jsp").forward(req, resp);

乱码

场合:页面本身有中文的时候

解决办法:servlet:resp.setContentType("text/html;charset=gbk");

Jsp: <%@ page contentType="text/html;charset=gb2312"%>

注意:一定要写在PrintWriter out = resp.getWriter();之前

场合:解决get方式乱码问题:

解决办法:修改server.xml àURIEncoding="GBK"

场合:解决post方式提交内容的乱码

解决办法:request.setCharacterEncoding("GBK");

注意:一定要写在存取第一个参数之前 不要调用response.setCharacterEncoding("GBK");

场合:<jsp:param name="user" value="<%=s%>"/>,url地址包含中文参数

解决办法:<%request.setCharacterEncoding("GBK");%>

n WEB-INF子目录下面不能放置html jsp 等文件

n html,jsp不能直接打开 应在ie中输入服务器地址+应用程序路径

原创粉丝点击