1JSP语法

来源:互联网 发布:2015房价知乎 编辑:程序博客网 时间:2024/06/01 23:54
JSP中./代表的是文件所在的当前目录。../代表当前目录的父目录。servelet中"/"代表Web应用的根目录,就是webapp。


1在传统的HTML页面文件中加入Java程序片和JSP标记就构成了一个JSP页面。一个JSP页面可由5个元素组合而成:
普通的HTML标记符。
JSP标记。如:指令标记、动作标记。
变量和方法的声明。
Java程序片。
Java表达式。


例:
<%@page contentType="text/html;charset=GB2321" %>
<%@page import="java.util.Date" %>
<%! Date date;//数据声明。
    int start,end,sum;
    public int continueSum(int start,int end){//方法声明。
    for(int i=start;i<=end;i++)
    sum=sum+i;
    return sum;
    }
%>
<html>
<body bgcolor=cyan>
<font size=4>
<p>程序片创建Date对象;
<% date=new Date();//Java程序片。
   out.println("<br>"+date);
   start=1;
   end=100;
   sum=continueSum(start,end);
%>
<br>从
    <%= start %>  <!-- Java表达式 -->
    至
    <%= end %>
    的连续和是
    <%= sum %>
</font>
</body>
</html>


2变量和方法的声明
在<%!和%>标记符号之间声明变量和方法。


声明变量
在<%!和%>之间放置Java的变量声明语句。变量的类型可以是Java语言允许的任何数据类型,我们将这些变量的JSP页面的成员变量。如:
<%!
   int a,b=10,c;
   String tom=null,jerry="love JSP";
   Date date;
%>


<%!与%>时间之间声明的变量在整个JSP页面内都有效,与<%!,%>标记在JSP页面的中的书写位置无关,但习惯上把<%!与%>标记符放在JSP页面的前面。


JSP引擎将JSP页面转译成Java文件时,将<%!与%>标记符之间声明的变量作为类的成员变量,这些变量占有内存空间直到JSP引擎关闭才释放,当多个客户请求一个JSP页面时,JSP引擎为每个客户启动一个线程,这些线程共享JSP页面的成员变量,因此任何一个用户对JSP页面成员变量操作的结果,都会影响到其他用户。


声明方法
在<%!和%>之间声明方法,该方法在整个JSP页面有效。但在该方法内定义的变量只在该方法内有效。


3Java程序片
可以在<%和%>之间插入Java程序片,一个JSP页面可以有许多程序片,这些程序片将被JSP引擎按顺序执行。在程序片中声明的变量称为JSP页面的局部变量。局部变量的有效范围与其声明的位置有关,即局部变量在JSP页面后继的所有程序片以及表达式部分内有效。JSP引擎将JSP页面转译成Java文件时,将各个程序片的这些比哪里作为类中某个方法的变量,即局部变量。


如果一个用户在执行Java程序片时调用JSP页面的方法操作成员变量时,可能不需要其他用户也调用该方法操作成员变量,以免对其产生不利影响,那么就应该将操作成员变量的方法用synchronized关键字修饰。当一个线程在执行java程序片期间调用synchronized方法时,其他线程想在Java程序片中调用这个synchronized方法时就必须等待,直到调用synchronized方法线程调用执行完该方法。
例:
<@page contentType="text/html;Charset=GB2312" %>
<HTML>
<BODY>
<%! 
int count=0;
synchronized void setCount()
{
count++;
}
%>
<%
setCount();
out.println("您是第"+count+"个访问本站的客户");
%>
</BODY>
</HTML>


4Java表达式
可以在<%=与%>之间插入一个表达式,这个表达式必须能求值。


JSP中的注释
JSP页面中的注释可分为两种:
HTML注释:在标记符号<!--和-->之间加入注释内容。
JSP引擎把HTML注释交给客户,因此客户通过浏览器查看JSP页面的源文件时,能够看到HTML注释。


JSP注释:在标记符号<%--和--%>之间加入注释内容。//为行注释


5JSP指令标记
page指令标记
page指令标记用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。可以用一个page指令指定多个属性的值。如:
<%@ page 属性1="属性1的值" 属性2="属性2的值".... %>


也可以使用多个page指令分别为每个属性指定值。如:
<%@ page 属性1="属性1的值" %>
<%@ page 属性2="属性2的值" %>
...


page指令的作用对整个JSP页面有效,与其书写的位置无关,但习惯把page指令写在JSP页面的最前面。


page指令可以指定如下属性的值:
contentType属性
当用户请求一个JSP页面时,Tomcat服务器负责解释执行JSP页面,并将某些信息发送到客户的浏览器,以便用户浏览这些信息。Tomcat服务器同时负责通知客户的浏览器使用怎样的方法来处理所收到的信息。这就要求JSP页面必须设置响应MIME(multipurpose internet mail extention)类型和JSP页面字符的编码,即设置contentType属性的值。


contentType属性值的一般形式是:"MIME类型"或"MIME类型;charset=编码"


***************如果用户希望客户的浏览器启用HTML解析器来解析所接受到的信息,就可以做如下设置:**************
<%@ page contentType="text/html;charset=GB2312" %>


如果希望客户的浏览器启用本地的MS-Word应用程序来解析执行收到的信息,可以做如下设置:
<%@ page contentType="application/msword" %>


JSP页面使用page指令只能为contentType指定一个值,不允许两次使用page指令给contentType属性指定不同的属性值。contentType属性的默认值是:"text/html;charset=ISO-8859-1"


可以使用page指令为contentType属性指定的值有:text/html,text/plain,image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword


language属性
该属性用来定义JSP页面的脚本语言,该属性的值目前只能取"java"。
<%@ page language="java" %>


import属性
该属性的作用是为JSP页面引入java运行环境提供的包中的类,这样可以在JSP页面的程序片的部分、变量及函数声明部分,表达式部分使用包中的类。如:
<%@ page import="java.io.*","java.util.Date" %>
JSP页面默认的import属性值为:
"java.lang.*","javax.servlet.*","javax.servlet.jsp.*","javax.servlet.http.*"


session属性
该属性用于设置是否需要使用内置的session对象。session属性值可以是true或false,默认为true。


buffer属性
内置输出流对象out负责将服务器的某些信息或运行结果发送到客户端显示,buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。如:<%@ page buffer="24kb" %>
buffer属性取"none"即设置out不使用缓冲区。 


autoFlush属性
该属性指定out缓冲区被填满时,缓冲区是否自动刷新。autoFlush属性可以取true或false,默认值是true。


isThreadSafe属性
isThreadSafe属性用来设置JSP页面是否可以多线程访问。isThreadSafe的属性值取true或false。当isThreadSafe属性值为true时,JSP页面能同时响应多个客户的请求;当isThreadSafe设置成false,JSP页面同一时刻只能处理响应一个客户的请求。它的默认值是true。


info属性
info属性的属性值是一个字符串,其目的是为JSP页面准备一个常用且可能需要经常修改的字符串。如:
<%@ page info="we are students" %>


可以在JSP中使用getServletInfo()获取info属性的属性值。this.getServletInfo()
<%@ page  contentType="text/html;charset=GB2312"%>
<%@ page info = "我写的Servlet页面信息"%>
<% 
String info = getServletInfo();
out.println(info);
%>




errorPage属性
该属性只是如果JSP页面出现某个错误,该语句将定义一个出现错误的导向页;用户将看到该导向页,以得知自己的JSP页面出错。


6include指令标记
如果需要在JSP页面内某处整体嵌入一个文件,就可以考虑使用include指令标记。其语法格式如下:
<%@ include file="文件的URL" %>
例如<%@ include file="common/taglibs.jsp" %>表示web项目根路径下的common/taglibs.jsp


include指令标记的作用是在JSP页面出现该指令的位置处,静态插入一个文件。被插入的文件必须是可访问的和可使用的。如果该文件和当前JSP页面在同一Web服务目录中,那么文件的URL就是文件名字。


所谓静态插入,就是当前JSP页面和插入的文件合并成一个新的JSP页面,然后JSP引擎在将这个新的JSP页面转译成java文件。因此,插入文件后,必须保证新的合并成的JSP页面符合JSP语法规则。Tomcat 5.0版本以后的服务器每次都要检查include指令标记嵌入的文件是否被修改过,如果对嵌入的文件进行了修改,那么Tomcat服务器会重新编译JSP页面。


7JSP动作标记
动作标记是一种特殊的标记,它影响JSP运行时的功能。


include动作标记
include动作标记的语法格式为:
<jsp:include page="文件的URL"/>

<jsp:include page="文件的URL">
param 子标记
</jsp:include>
jsp:include标签page的路径以"/"开头表示相对与web根路径


动态插入jsp:include动作标记告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。与静态插入文件的include指令标记不同,当JSP引擎把JSP页面转译成java文件时,不把JSP页面中动作指令include所包含的文件与原JSP页面合并成一个新的JSP页面,而是告诉Java解释器,这个文件在JSP运行时才包含进来。如果包含的文件是普通的文本文件,就将文件的内容发送到客户端,由客户端负责显示。如果包含的文件是JSP文件,JSP引擎就执行这个文件,然后将结果发送到客户端,并由客户端负责显示这些结果。


还可以将<jsp:include>包含的页面放入table表格中。例如:
<%@ page contentType="text/html;charset=GB2312"%>
<html>
<body>
<table width="100%" height="100%">
<tr>
<td width="400" valign="top" height="50%" bgcolor="#CCFFCC">
<jsp:include page="welcome.jsp"/>
</td>
</tr>
<tr>
<td width="400" valign="top" height="50%">
<jsp:include page="userReg.jsp"/>
</td>
</tr>
</table>
</bndy>
</html>


param动作标记
param标记以"名字-值"对的形式为其他标记提供附加信息,param标记不能独立使用,需作为jsp:include、jsp:forward、jsp:plugin标记的子标记使用。


param动作标记的语法格式为:
<jsp:param name="名字" value="指定给param的值">


当param标记与jsp:include动作标记一起使用时,可以将param标记中的值传递到include动作标记要加载的文件中去,被加载的jsp文件使用Tomcat服务器提供的request内置对象获取include动作标记的param子标记中name属性所提供的值。


String a=request.getParameter("param的name属性名");


例如:向被包含的页included2.jsp传递参数: 
<jsp:include page="included2.jsp" flush="true">     
     <jsp:param name="ref1" value="AAA"/> 
     <jsp:param name="ref2" value="BBB"/> 
</jsp:include> 




page属性: 相对路径指明被包含的文件 
flush属性: 必须用true ,表示页面可刷新。
可以用jsp:param向被包含的动态页即JSP页传递参数(而include指令则不可以),参数以”参数名-值”对的形式传递,被包含的页使用request.getParameter(“参数名称”)可以获取相应参数的值
在included2.jsp通过EL表达式 : $(param.ref1)  相当于  request.getParameter("ref1")取出ref1的值。


动态include和静态include的区别
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数.


静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>


forward动作标记
forward动作标记的语法格式为:
<jsp:forward page="要转向的页面或者是servlet"/>

<jsp:forward page="要转向的页面或者是servlet">
param子标记
</jsp:forward>


在指令的作用是从该指令处停止当前页面的继续执行,而转向执行page属性指定的JSP页面或者是servlet。forward标记可以使用param动作标记作为子标记,以便向要转向的页面传送信息。forward动作标记指定的要转向的JSP文件可以使用Tomcat服务器提供的request内置对象获取param子标记中name属性所提供的值。


8plugin动作标记
plugin动作标记指示JSP页面加载Java plugin,该插件由客户负责下载,并使用该插件来运行java applet程序。


plugin动作标记的语法格式:
<jsp:plugin type="applet|bean" code="小应用程序的字节码文件" jreversion="Java虚拟机的版本号" width="小程序的宽度值" height="小应用程序的高度值">
<jsp:fallback>
提示信息:用来提示用户的浏览器是否支持插件下载
</jsp:fallback>
</jsp:plugin>
例:
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<body>
<jsp:plugin name="applet0" code="com.gis.client.AddIn.class" codebase="./applet/"  type="applet" width="0" height="0">
<jsp:params>
            <jsp:param value="<%=userName %>" name="userName"/>
            <jsp:param value="<%=userId %>" name="userId"/>
            <jsp:param value="10010" name="port"/>
            <jsp:param value="true" name="MAYSCRIPT"/>
        </jsp:params>
        <jsp:fallback>   
            <p>浏览器不支持该插件</p>
          </jsp:fallback>     
</jsp:plugin>
</body>
</html>
plugin标签,告诉浏览器当前这个对象是一个插件,它的属性:
 type表示该插件的类型是什么
          name可以在和后台交互时指出是哪一个插件
当Applet为Class类文件嵌入的写法:
          code表示Applet类名,必须带有包路径在内的全路径名称。
 codebase表示Class类文件相对于Html页面的相对路径。
当Applet为一个Jar包,嵌入html的写法:
codebase表示Applet Jar包现对于Html页面的相对路径。
archive表示Applet jar包文件名。  
上例中指出com.gis.client.AddIn.class指出该AddIn.class在当前目录下的applet文件夹下有com/gis/client 三级文件夹下。
          同时页面可以给Applet程序传参:
在applet中通过getParameter("userName");来获得。


fallback是当前浏览器如果不能运行该插件时,要显示的内容。


不能将AddIn.class放在WEB-INF下,因为这是个特殊目录,放在WEB-INF下将找不到该Applet,也不会报错。该Applet也不会执行,例如通过


applet调用js脚本
applet中调用前台的脚本可以通过import netscape.javascript.*;注意版本的问题1.4以前用的是jaws.jar包,以后就改用plugin.jar包了。
          JSObject win = JSObject.getWindow(this);
          win.eval("javascript:displayResult(/"" + content + "/");");
          在页面要有displayResult(content)这个脚本。
netscape.javascript.JSObject.
在C:\Program Files\Java\jdk1.5.0_06\jre\lib\plugin.jar(jdk1.5)中 
例如:MyApplet.java
package lifecenter.applet;
import netscape.javascript.JSObject;
public class MyApplet extends javax.swing.JApplet{
private static final long serialVersionUID = 1L;


public void init(){


}

public void start(){
String content="applet 调用js:";
JSObject win = JSObject.getWindow(this);
        win.eval("javascript:displayResult(\"" + content + "\");");
}
}
jsp页面引入Applet
<%@page contentType="text/html; charset=utf-8"%>
<%@ include file="/common/taglibs.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>测试</title>
<script type="text/javascript">


function displayResult(result){
alert(result);
}
</script>
</head>
<body>
java applet调用js打印系统路径:
<br/>


<jsp:plugin name="applet0" code="lifecenter.applet.MyApplet.class" codebase="../plugin" type="applet" width="0" height="0">
        <jsp:fallback>   
            <p>浏览器不支持该插件</p>
          </jsp:fallback>     
</jsp:plugin>


</body>
</html>


9setProperty动作标记
jsp:setProperty动作标记bean的一个或多个属性,在此动作之前,bean必须用jsp:useBean定义。
jsp:setProperty语法如下:
<jsp:setProperty name="beanName" prop_expr/>
其中,prop_expr可以使用以下形式:
property="*"
property="属性名"
property="属性名" param="参数名"
property="属性名" value="属性值"
属性值必须是字符、文字或表达式。
name,由jsp:useBean动作或其他元素定义的bean的名字。bean的实例必须包括要设置的属性。
property,要设置的bean属性的名字。如果设置propertyName为*,则jsp:setProperty遍历当前请求的参数,把参数名和参数值匹配的bean的属性名和属性值。如果参数中为空字符串(""),则不修改相应的属性。


在同一个jsp文件中,jsp:useBean元素必须出现在jsp:setProperty之前。


前三个prop_expr形式把一个字符串表示的值给bean的属性。但如果bean属性的类型不是字符串,则JSP引擎自动完成类型转换。第四种形式的prop_expr把一个对象赋值给bean的属性,jsp引擎自动把对象转换称bean属性的数据类型。


Param是给bean属性赋值的请求参数的名字。


动作标记中不能同时含有param和value。


10<jsp:getProperty>把bean的属性值作为字符串写到out对象中,在使用此动作之前须定义bean。此动作的语法如下:
<jsp:getProperty name="name" property="propertyName"/>
name,指定此属性所在的bean的名字。如果没有找到此bean,则此动作产生一个异常。
property,要输出属性的名字,作用是返回bean的属性值,转化称字符串,并插入到输出。


****************
前台javascript如何与后台JSP通信,可以通过AJAX来完成。另外还有方法:
后台JSP可以通过getParameter()来获得javascript提交过来的信息。
而前台javascript可以通过document.getElementById("id").value="<%=xxx%>"来将JSP变量的值传递给Dom元素


****************
tomcat-apache下载:http://tomcat.apache.org/download-60.cgi


****************
通过动态include jsp页面或静态include jsp页面,这样得到的总页面时放置一个document下,可以功过document访问另一个include过来的页面中的元素。


****************
通过按钮的点击事件来访问某个action:
<input type="button" value="创建索引" onclick='window.location.href="lucene/luceneFirst.action"'>


***************
当在java类中用out.print输出时,对于输出斜杠“\”的地方要转义换成双斜杠“\\”。对于输出html元素一定要有结束,不然会有一些问题。如输出:
<a ....>一定要写成<a ...></a>用</a>来结束。


******************
Servlet容器、Filter的url匹配过程:
如果web.xml中配置了多个servlet,当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。其匹配规则和顺序如下:
首先精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。


然后最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此 时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。 


最后扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action


对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一 个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。


服务器启动先加载listener->servlet->filter




**************************************
web.xml里面可以定义两种参数:
application范围内的参数,存放在servletcontext中,在web.xml中配置如下:
 <context-param>
           <param-name>context/param</param-name>
           <param-value>avalible during application</param-value>
  </context-param>


servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:
 <servlet>
    <servlet-name>MainServlet</servlet-name>
    <servlet-class>com.wes.controller.MainServlet</servlet-class>
    <init-param>
       <param-name>param1</param-name>
       <param-value>avalible in servlet init()</param-value>
    </init-param>
   <load-on-startup>0</load-on-startup>
 </servlet>


第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到。
第二种参数只能在servlet的init(ServletConfig config)方法中通过this.getInitParameter("param1")或config.getinitParameter(String)取得。


*********************
java web项目的WEB-INF/classes目录就是所谓的classpath。




在jsp页面如果图片路径前面是斜杠/,例如:<img src="/lifecenter/01.jpg" id="testimg"/>则表示该图片是lifecenter web应用(lifecenter.war)下的01.jpg图片,只有将01.jpg放在web应用下(即.war目录下)才能找到,如果直接放到不在某个web应用下的目录中就找不到该文件。


******************
 JAVA WEB应用设置session timeout 


JAVA WEB应用设置session时间有3个方法:
1. 在tomcat-->conf-->server.xml文件或应用对应的单独的xml中定义:
在Context节点添加 defaultSessionTimeOut属性值,单位为秒,示例代码如下:
<Context docBase="D:/My Documents/workspace/demo/WebRoot" path="" reloadable="true" debug="0" defaultSessionTimeOut="3600" ></Context>
 2. 在web.xml中定义,web节点下添加 session-config节点,单位是分,示例代码如下:


<session-config>  
  <session-timeout>60</session-timeout>   
</session-config> 
如果在tomcat-->conf-->web.xml文件中定义表示为tomcat下所有web设置session
3. 在程序中定义,单位为秒,设置为-1表示永不过期,示例代码为:
session.setMaxInactiveInterval(30*60); 
Session设置产生效果的优先循序是,先程序后配置,先局部后整体。


****************
在jsp页面获取项目根路径
${pageContext.request.contextPath},得到当前项目的根路径。


*****************
1. TomcatTomcat是apche的免费开源的Serlvet容器,由于它优秀的稳定性以及丰富的文档资料,广泛的使用人群,从而在开源领域受到最广泛的青睐。


2. Jboss作为Java EE应用服务器,它不但是Servlet容器,而且是EJB容器,从而受到企业级开发人员的欢迎,从而弥补了Tomcat只是一个Servlet容器的缺憾。


3. Resin也仅仅是一个Servlet容器,然而由于它优秀的运行速度,使得它在轻量级Java Web领域备受喜爱,特别是在互联网Web服务领域,众多知名公司都采用其作为他们的Java Web应用服务器,譬如163、ku6等。­


在商用应用服务器里主要有:Weblogic、Websphere,其中Weblogic我也使用过很长一段时间,当时也只用其当Servlet容器,然而就在同等条件下,在性能及易用性等方面,要比Tomcat优秀很多。­


4.glassfish是Sun公司推出的Java EE服务器,一个比较活跃的开源社区,不断的通过社区的反馈来提高其的可用性,经过glassfish v1 glassfish v2 到今天的glassfish v3 ,它已经走向成熟.Glassfish是一个免费、开放源代码的应用服务,它实现了Java EE 5,Java EE 5 平台包括了以下最新技术:EJB 3.0、JSF 1.2、Servlet 2.5、JSP 2.1、JAX-WS 2.0、JAXB 2.0、 Java Persistence 1.0、Common Annonations 1.0、StAX 1.0等.­


     支持集群,通过内存中会话状态复制,增强了部署体系结构的可用性与可伸缩性,它对集群有着很好的支持,可以简单到通过添加机器,就可轻松的提高网站的带负载能力,在解析能力方面,它对html的吞吐能力与apache服务器不分上下,就是tomcat所不能比的,支持目录部署,热部署,解决了tomcat 对热部署能力的缺陷.在版本方面做的更加人性化,有开发时用的简化版,专门用于部署web项目的版本,还要完全符合j2ee标准的版本.­




********************
jsp文件加载Activex的cab文件
如下,在jsp文件中添加以下<OBJECT>元素,然后axWebStamp.CAB文件需要放置到web项目根路径下。
<OBJECT ID="webstamp" codeBase="axWebStamp.CAB#version=1,0,0,1" 
CLASSID="CLSID:50A63832-93C9-4104-8627-5C0FCA1F49CE" 
WIDTH=150 HEIGHT=150 style="position: absolute; left: 143; top: 80"> 
</OBJECT>


***************
 如果需要在html页面上设置不缓存,这在<head>标签中加入如下语句:


1 <meta http-equiv="pragma" content="no-cache">
2 <meta http-equiv="cache-control" content="no-cache">
3 <meta http-equiv="expires" content="0">   


*****************
单例模式:
作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。


单例模式要点
  显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。


Java中的单例模式
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。一般Singleton模式通常有两种形式:
第一种形式: 也是常用的形式。
  public class Singleton {
  private static Singleton instance = null;
  private Singleton(){
  //do something
  }
  public static Singleton getInstance(){
  if(instance==null){
  instance = new Singleton();
  }
  return instance;
  }
  } //这个方法比下面的有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率 
第二种形式:
  public class Singleton {
  //在自己内部定义自己的一个实例,只供内部调用
  private static Singleton instance = new Singleton();
  private Singleton(){
  //do something
  }
  //这里提供了一个供外部访问本class的静态方法,可以直接访问
  public static Singleton getInstance(){
  return instance;
  }
  }


  当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存。本人对这个说法持保留态度。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?




***************************


首先所有的请求进入tomcat,都会流经servlet,如果没有匹配到任何应用指定的servlet,那么就会流到默认的servlet。
默认的servlet是配置在$catalina/conf/web.xml里面的。


 <servlet>  
      <servlet-name>default</servlet-name>  
      <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>  
      <init-param>  
          <param-name>debug</param-name>  
          <param-value>0</param-value>  
      </init-param>  
      <init-param>  
          <param-name>listings</param-name>  
          <param-value>false</param-value>  
      </init-param>  
      <load-on-startup>1</load-on-startup>  
  </servlet>  
  
  
  <servlet>  
      <servlet-name>jsp</servlet-name>  
      <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>  
      <init-param>  
          <param-name>fork</param-name>  
          <param-value>false</param-value>  
      </init-param>  
      <init-param>  
          <param-name>xpoweredBy</param-name>  
          <param-value>false</param-value>  
      </init-param>  
      <load-on-startup>3</load-on-startup>  
  </servlet>  
<servlet-mapping>  
      <servlet-name>jsp</servlet-name>  
      <url-pattern>*.jsp</url-pattern>  
  </servlet-mapping>  
  
  <servlet-mapping>  
      <servlet-name>jsp</servlet-name>  
      <url-pattern>*.jspx</url-pattern>  
  </servlet-mapping>  


tomcat初始化一个context的时候就会初始化context下面所有的 servlet,包括这个默认的servlet。
它就是从servletContext里面加载的资源中去取出需要的资源,然后加载进来,并且判断相应的mime类型设置不同的HTTP head,然后输出到页面上




******************************
更改web项目的ico,先制作一个32*32的图标,然后再jsp页面的<head></head>中加入一下内容:
<link rel="Shortcut Icon" href="${ctx }/css/images/favicon.ico"></link>
<link rel="Bookmark" href="${ctx }/css/images/favicon.ico"></link>

0 0
原创粉丝点击