??xml version="1.0" encoding="utf-8" standalone="yes"?> 当用户从表单处完成递交Q如无问题已注册信息写入数据库Q但有问题的是,如何防止用户h面Q这相当于将原有的信息再ơ写入数据库Q在|络上寻找解x法,试用后将本h认ؓ(f)最用的方法记下?/p>
|络中给出如下解x式:(x) W一U:(x)用提交按钮 当用h交表单后Q用JAVASCRIPT脚本语言Q将提交钮禁用?/p>
分析Q如客户端没有开启脚本功能就出现问题Q这也仅是在表单处理前有用,防止用户多次点击提交钮;现在很多|站都启用验证码解决此问题了(jin)?/p>
W二U:(x)使用 Session 在第一ơ写入数据库代码后,Session标记Q在数据库代码前判断Session是否曄标记qƈ与刚才的标记是否相等?/p>
代码Q?/font> Session("User") = True Response.write "(zhn)刚才已l注册过?#8230;…" ...... '省略写入数据库部?/p>
Session("User") = True End if 分析Q比较管用的Q但Session默认时效?0分钟Q虽然可以设|时效长度,但由于网站服务器讄不同Q也许达不到理想效果?/p>
W三U:(x)重新定向 注册完毕后直接将|页重新定向到其他页面?/p>
代码Q?/font>Response.Redirect "Index.html" 分析Q用此Ҏ(gu)Q需要配合客L(fng)脚本清除历史(history)才行Q没有试用,因ؓ(f)用户可以使用后退按钮Ql刷新?/p>
W四U:(x)止~存 在写入数据一|下边d下面的代码,然后导向新页Q可以用户点击后退按钮后,面提示|页q期?/p>
代码Q?/font> ASPQ?br />
Response.Buffer = True ASP.NETQ?br />
Response.Buffer=true; 分析Q试用后Q发C个问题,虽然表面看到|页q期字样Q但在过期网上hQ仍可以再次h多次注册?/p>
W五U:(x)用弹出窗?/font> 提交表单的时候弹出新H口Q在新窗口页面完成数据库的写入)(j)Q关闭本H口。对于window.open()打开的窗口是无法用后退按钮的?/p>
W六U:(x)调数据库q行Ҏ(gu) q一U是得不偿失的方法,因ؓ(f)?x)加重服务器的负担,如果在表单没有进行AJAX方式的验证,q也是一U必要的Ҏ(gu)?/p>
代码Q(假设已连接数据库Q?/font> Dim Rs,SQL,UserId UserId = Request("Userid") '从表单从取数据内?/p>
If UserId <> "" then '不ؓ(f)I的时?br />
Set Rs=Server.CreateObject("Adodb.Recordset") l过试Q如果不惛_费事Q直接用W六U方法,用户刷一ơ就Ҏ(gu)据库(g)索一ơ,q种方式最大的弊端是有可能把服务器篏死; ׃Q我采用?jin)第二种?gu)Q结合了(jin)W四U(效果不大Q,在代码最前端加入?jin)验证由何处来本站的函数Q这样可以防止用戯己在本机模仿|站表单提交数据Q?a target="_blank">hi.baidu.com/76512/blog/item/b8d9be8f168d3aedf01f3680.htmlQ,也可以防止用户在本站直接在网址末端加变量值刷新数据?/p>
׃在表单处已加入随机验证码Qƈ已写入Session中,在处理数据前Q可以先(g)Session是否为空Q空为已提交q了(jin)Q不为空是第一ơ提交,在第一ơ提交后该Session清空?/p>
代码Q?/font> If Session("RndNum") = "" ...... '省略写入数据库代?/p>
Session("RndNum") = "" 分析Q只要是从正常的途径递交的表单,Session("RndNum")的数g?x)?f)I的Q从非正帔R径Q比如说Q直接打开|址Q或在本机模拟表单递交Q或在网址后添加变量|是无法写入数据库的。Session默认?0分钟Q清I后仍然W合逻辑。也不怕用h开几个注册面Q来回刷新注册?br />
Else
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.CacheControl = "no-cache"
Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1);
Response.Expires=0;
Response.CacheControl="no-cache";
SQL = "Select Userid From ?Where Userid='"& UserId &"'"
Rs.Open Sql, Conn, 2, 2
If Rs.Eof And Rs.Bof Then
Response.Write "没有相同数据Q?
Else
Response.Write "有相同数据!"
End If
Rs.Close
Set Rs = Nothing
Response.End
End If
Response.Write "已提交过数据?jin)呀Q?
Else
End if
用面~存的几U方法(静态和动态)(j)
1、在Asp面首部<head>加入
以下是引用片D:(x)
Response.Buffer = True
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "No-Cache"
2、在HtML代码中加?nbsp;
以下是引用片D:(x)
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>
3、在重新调用原页面的时候在l页面传一个参?nbsp; Href="****.asp?random()"
前两个方法据说有时会(x)失效Q而第三种则是在蟩转时传一个随机的参数Q?因ؓ(f)aspx的缓存是与参数相关的Q如果参C同就不会(x)使用~存Q而会(x)重新生成面Q每ơ都传一个随机的参数可以避免用缓存。这个仅适用于asp&asp.net
4、在jsp面中可使用如下代码实现无缓存:(x)
以下是引用片D:(x) response.setHeader("Cache-Control","no-cache"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server |
q些代码加在<head> </head>中间具体如下
以下是引用片D:(x) <head> <% response.setHeader("Cache-Control","no-cache"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server %> </head> |
5、window.location.replace("WebForm1.aspx");
参数是你要覆盖的页面,replace的原理就是用当前面替换掉replace参数指定的页面?nbsp;
q样可以防止用户点击back键。用的?a >javascript脚本QD例如下:(x)
a.html
以下是引用片D:(x) <html> <head> <title>a</title> <script language="javascript"> function jump(){ window.location.replace("b.html"); } </script> </head> <body> <a href="javascript:jump()">b</a> </body> </html> |
b.html
以下是引用片D:(x) <html> <head> <title>b</title> <script language="javascript"> function jump(){ window.location.replace("a.html"); } </script> </head> <body> <a href="javascript:jump()">a</a> </body> </html> |
?U只是清IZ(jin)cacheQ即存储在Temporary Internet Files文g夹中的(f)时文Ӟ而第五种则是使用跌{面文g替换当前面文gQƈ没有清空cacheQ也是说Temporary Internet Files产生?jin)相关的临时文gQ两者搭配用真是清I缓存,必备良药?/p>
4 session
(1)void setAttribute(String key,Object value)
(2)Object getAttribute(String key)
(3)HttpSession request.getSession()
(4)HttpSession request.getSession(boolean true)
(5)void session.setMaxInactiveInterval(2)//讄?x)话q期旉
(6)void invalidate()//销毁session,删除HttpSession对象?qing)数?br />
(7)void remove(String key)
(8)boolean isNew()//是否是最C(x)?br />
在web.xml中配|session默认q期旉
<session-config>
<session-timeout>5</session-timeout>//单位为分?br />
</session-config>
5 applicate->servletContext
(1)void setAttribute(String key,Object value)
(2)Object getAttribute(String key)
6 pageContext
6 serviceҎ(gu)
-----------------------------------------------------------------
步骤Q?br />
1 建立接口
public interface IBookService {
public int addBook(Book book);
}
2 实现接口
public class ProessBookService implements IBookService {
public int addBook(Book book) {
BookDao bookDao=new BookDao();
return bookDao.addBook(book);
}
}
3 在src下创建META-INF文g夹,在META-INF下创建xfire文g夹,在xfire下创建services.xml
(src-->META-INF-->xfire-->services.xml)
<service>
<name>BookService</name>
<namespace>http://www.book.com</namespace>
<serviceClass>org.book.IBookService </serviceClass>
<implementationClass>org.book.ProessBookService </implementationClass>
</service>
4 ~写web.xml
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
5 ~写调用Ҏ(gu)
Service serviceModle=new ObjectServiceFactory().create(IBookService.class);
XFire xFire=XFireFactory.newInstance().getXFire();
XFireProxyFactory factory=new XFireProxyFactory(xFire);
String urlString="http://localhost:8080/ownhome/services/ProessBookService";
IBookService bookService=(IBookService) factory.create(serviceModle, urlString);
private static long onlineNumber=0;
public void sessionCreated(HttpSessionEvent se) {
onlineNumber++;
}
public void sessionDestroyed(HttpSessionEvent se) {
onlineNumber--;
}
public static long getOnlineNumber(){
return onlineNumber;
}
}
2 配置web.xml
<listener>
<listener-class>com.tags.CounterListener</listener-class>
</listener>
3 JSP面
<%@page import="com.tags.CounterListener;"%>
<body>
当前的在Uh敎ͼ(x)<%=CounterListener.getOnlineNumber() %> <br>
</body>
----------------------------------------------------------------------------
ServletContext监听器接?br />
ServletContextListener
1 contextInitialized()
2 contextDestroyed()
调用机制
当在web应用中部|了(jin)实现该接口的实现cd,在WEB容器加蝲WEB应用??启动服务?׃(x)自动调用contextInitialized()Ҏ(gu),
而当WEB容器销毁WEB应用??关闭服务?,?x)自动调用contextDestroyed()Ҏ(gu).
-----------------------------------------------------------------------------------
ServletContextAttributeListener
1 attributeAdded()
2 attributeReplaced()
3 attributeRemoved()
触发事g的代?br />
context.setAttribute("counter",new Integer(0));
context.setAttribute("counter",new Integer(100));
context.removeAttribute("counter");
-----------------------------------------------------------
HttpServletRequest监听?br />
ServletRequestListener
1 requestInitialized();
2 requestDestroyed()
调用机制
与ServletContextListener接口cM,在web应用中部|实现该接口的实现类?在HttpServletRequest对象(JSP中的request对象)建立
或者被销毁时,由web容器自动调用requestInitialized()或者requestDestroyed()Ҏ(gu).
--------------------------------------------------------------------------------------
ServletRequestAttributeListener
1 attributeAdded();
2 attributeReplaced();
3 attributeRemoved();
触发事g的代?br />
request.setAttribute("username","lisi");
request.setAttribute("username","wangwu");
request.removeAttribute("username");
******************************************************************
public class ListenerOnline implements HttpSessionLinstener,ServletContext{
private application;
public void sessionCreated(HttpSessionEvent event){
Integer n=(Integer)application.getAttrabute("z",1000);
application.setAttrabute("z",n.IntValue()+1);
}
public void sessionDestroyed(HttpSessionEvent event){
}
public void contextInitialized(ServletContextEvent event){
application=event.getServletContext();
application.setAttrabute("z",1000);
}
public void contextDestroyed(ServletContextEvent event){
}
}
<listener>
<listener-class>com.tags.ListenerOnline</listener-class>
</listener>
<meta http-equiv="refresh" content="3"/>
request.getParameter("param");
request.setAttribute("loginname",object);
request.setCharacterEncoding("gb2312");
输入内容转成中文
-HttpServletResponse response对象
response.setContentType("text/html;charset=gb2312");
讄输出Z?br />
response.sendRediredt("url");
-RequsetDispatcher dispatcher=request.getRequestDispatcher(url);
定义转发?br />
dispatcher.forward(request,response);
-HttpSession session对象
创徏对象的两U方?br />
HttpSession session = request.getSession(boolean value);
HttpSession session = request.getSession();
Ҏ(gu)一QtrueӞq回该当前请求相关的?x)话Q如果不存在创徏一个新的会(x)话,q返回?br />
falseӞq回该当前请求相关的?x)话Q如果不存在q回nullQ不创徏?x)话?br />
Ҏ(gu)二:(x){同于方法一为true时?br />
HttpSession接口的方?br />
session.setAttribute(String name,Object value);
session.getAttribute(String name);//q回Object
session.removeAttribute(String name);//删除
session.invalidate()//当前?x)话关?br />
*/
/*
dxml文g中的参数?br />
web.xml
<servlet>
<init-param>
<param-name>repeat</param-name>
<param-value>10</param-value>
</init-param>
</servlet>
servlet.java
int repeat=Integer.parseInt(this.getInitParameter("repeat"));
*/
/*
得到当前servlet相当信息的方?br />
request.getServerName()//得到当前h的服务器名子
request.getRemoteAddr()得到当前h服务器的IP地址
request.getServerPort()得到当前h服务器的端口?br />
request.getProtlcol()得到当前h的协议版?br />
request.getContextPath()得到当前h的上下文地址
request.getScheme()得到当前h的协议类?br />
request.getMethod()得到当前h的提交方式GET
request.getRequestURI()得到当前服务器servlet的映\径,带上下文
request.getServletPath()得到当前服务器servlet的映\?/p>
servlet的头信息
Enumeration e=request.getHeaderNames();得到包含header名子的EnumerationcdŞ对象
request.getHeader()得到header名子对应的?br />
例子Q?br />
Enumeration e=request.getHeaderNames();
String name="";
while(e.hasMoreElements)
{
name=(String)e.nextElement();
System.out.println(name);
System.out.println(request.getHeader(name));
}
JSValidation验证框架
url:http://cosoft.org.cn/projects/jsvalidateion
修改validation-framwork.js
var ValidationRoot="/webproject2/js/"
配置validation-config.xml
FCKeditor文本~辑lg
http://www.fckeditor.net/download
class
class.forName(String className)
q行中的对象都是class的一个实例,相关技?反射
class.getResourceAsStream(String fileName)
查找hl定名称的资?/p>
Resultcdjava.servlet.jsp.jstl.sql.Result包中,可以在关闭连接的状态下使用
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
Result result=ResultSupport.toResult(rs);
if(result==null){
System.out.println("无数?);
}
for(int i=0;i<result.getRowCount();i++){
Map map=result.getRows()[i];
map.get("username");
}
作业Q连接池Q配|文?br />
<embed src=""/>
歌手表,gid,sex,name,love
歌曲?id,name,gid,typeid,歌词
cd?typeid,name
url
controls.play()
controls.stop()
name=new String (name.getBytes("iso-8859-1"),"gbk");
1 qo(h)?br />
HttpServletRequest req=(HttpServletRequest)request;
request.setCharacterEncoding("gbk");
china.do();
2 子控制器
public class ToChinese extends RequestProcessor{
public boolean processProcess(HttpServletRequest req,HttpServletRespone rep){
request.setCharacterEncoding("gb2312");
return true;
}
}
struts-config.xml
<controller processorClass="com.org.ToChinese"/>
ȝQ?br />
TLD是一个XML文gQ在WEB-INF目录?br />
<taglib>根元?br />
<tlib-version>version</tlib-version>标记库的版本
<short-name>prefix</short-name>前缀名称
<uri>uri</uri>引用的地址
...
<tag>
<name>tagname</name>标记名称
<tag-class>classname</tag-class>标记对应的处理类
<tei-class>classname</tei-class>标记处理cȝ辅助处理c?br />
<body-content>[JSP,empty,scriptless,tagdependent]</body-content>
//jsp表示标记中可以包含html,java代码Q这些代码可以被q行
//empty表示标记中不包含内容
//scriptless表示标记中可以包含EL,jsp的动作代码,不可以包括JAVA脚本代码
//tagdependent表示标记中可以包?br />
<attribute>标记的属?br />
<name>pattern</name>属性的名称
<required>false</required>表示该属性是否是必须?br />
<rtexprvalue>false</rtexprvalue>该属性是否可以是JSP的表辑ּ
</attribute>
</tag>
</taglib>
TagSupportq行原理Q不能对标记所包含的内容进行二ơ加工)(j)
BodyTagSupportq行原理(可以对开始和l束标记所包含的内容进行处?
public int doAfterBody()throws JspTagException{
BodyContent bc=getBodyContent();取内?br />
String input=bc.getString();取内?br />
JspWriter out=bc.getEnclosingWriter();
String newContent=input;
try{
out.println(newContent);
}catch(IOException e){
throw new JspTagException(e);
}
return 1;
}
开源定制标记库
JSTL
Jakarta Taglibs http://jakarta.apache.org/taglibs/index.html
Display tag http://displaytag.sf.net
<c:if>标记
使用语法
1 <c:if test="condition" var="name" [scope="{page|request|session|application}"] />
2 <c:if test="condition" [var="name"] [scope="{page|request|session|application}"]>
body content
</c:if>
属?br />
-----------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; | ~省?br />
test | 判断所要用的条g | 可以 | ?nbsp; | ?br />
var | 保存条gl果的变量的名称 | ?nbsp; | ?nbsp; | ?br />
scope | 保存条gl果的变量的作用范围 | ?nbsp; | ?nbsp; | page
-----------------------------------------------------------------------------
<c:choose>标记
使用语法
<c:choose>
body content(<when>and<otherwise>)
</c:choose>
<c:when>标记
使用语法
<c:when test="condition">
body content
</c:when>
属?br />
-----------------------------------------------------------------------------
属性名 | 描述 | 动?nbsp; | 必?nbsp; | ~省?br />
test | 如果它的l果为true,执行<c:when>所包含?nbsp; | 可以 | ?nbsp; | ?br />
| 内容,false则不执行<c:when>所包含的内?nbsp; | | |
-----------------------------------------------------------------------------
<c:otherwise>标记
使用语法
<c:otherwise>
body content
</c:otherwise>
---------------------------------------------------------------------------
例子:
<c:choose>
<c:when test="${param.age>=70}">
70以上
</c:when>
<c:when test="${param.age>35 and param.age<70}">
35-70
</c:when>
<c:otherwise>
35以下
</c:otherwise>
</c:choose>
--------------------------------------------------------------------------------------------
<c:forEach>标记
使用语法
1 <c:forEach [var="name"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
2 <c:forEach [var="name"] items="collection" [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
属?br />
------------------------------------------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; | cd |~省?br />
begin | 开始下?nbsp; | 可以 | ?nbsp; | int |0
end | l束下标 | 可以 | ?nbsp; | int |集合中最后一个成员的索引
step | 步长 | 可以 | ?nbsp; | int |1
var | 代表当前成员的变量名 | ?nbsp; | ?nbsp; | String |?br />
items | q得循环的集?nbsp; | ?nbsp; | ?nbsp; | String,数组,Map,Collection,Iterator,Enumeration |?br />
varStatus | 昄循环状态的变量 | 可以 | ?nbsp; | String |?br />
-------------------------------------------------------------------------------------------------------------------------------
varStatus属?br />
----------------------------------------------------------
名称 | cd | 描述
index | int | 现在所操作的成员的索引
count | int | 现在所操作的成员的L
first | boolean | 现在所操作的成?是否为第一个成?nbsp;
last | boolean | 现在所操作的成?是否为最后一个成?nbsp;
----------------------------------------------------------
<%
String names[]=new String[4];
names[0]="afdsaf";
names[1]="dggh";
names[2]="bcbncn";
names[3]="434535";
pageContext.setAttribute("names",names);
Map map=new HashMap();
map.put("k1","v1");
map.put("k2","v2");
request.setAtrribute("map1",map);
%>
<c:forEach items="${names}" var="name" begin="1" end="2" step="1" varStatus="i">
${name } ${i.index } ${i.count } ${i.first } ${i.last }<br/>
</c:forEach>
<c:forEach items="${map1}" var="v">
${v.key } = ${v.value }<br/>
</c:forEach>
<c:forTokens>标记 一个字W串q行分隔
使用语法
<c:forTokens items="stringOfTokens" delims="delimiters" [var="name"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
body content
</c:forTokens>
属?br />
------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; | cd |~省?br />
items | q行q代处理的变?nbsp; | 可以 | ?nbsp; | String |?br />
delims | 分割W号 | 可以 | ?nbsp; | char |?br />
begin | 开始下?nbsp; | 可以 | ?nbsp; | int |0
end | l束下标 | 可以 | ?nbsp; | int |集合中最后一个成员的索引
step | 步长 | 可以 | ?nbsp; | int |1
var | 代表当前成员的变量名 | ?nbsp; | ?nbsp; | String |?br />
varStatus | 昄循环状态的变量 | ?nbsp; | ?nbsp; | String |?br />
-------------------------------------------------------------------------------------------
<c:forTokens items="dsf:dsafsa:dsffs,dfdfs" var="name" delims=":,">
${name }<br/>
</c:forTokens>
-------------------------------------------------------------------------------------------
<c:import>标记 相当于include另外一个页面的内容引入到当前页面来
使用语法
1 <c:import url="url" [context="context"] [var="name"] [scope="{page|request|session|application}"]
[charEncoding="charEncoding"]>
<c:param>//可传参数
</c:import>
2 <c:import url="url" [context="context"] varReader="varReaderName"
[charEncoding="charEncoding"]>
body content//内容
</c:import>
属?br />
------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; |~省?br />
url | 需要导入页面url地址 | ?nbsp; | ?nbsp; |?br />
context | 本地web应用的名?nbsp; | ?nbsp; | ?nbsp; |当前应用的名?br />
charEncoding | 讄导入数据的字W编?nbsp; | ?nbsp; | ?nbsp; |ISO-8859-1
var | 接受导入文本的变量的名称 | ?nbsp; | ?nbsp; |?br />
scope | 接受导入文本内容的变量的作用范围 | ?nbsp; | ?nbsp; |page
varReader | 用于接受导入文本的java.io.Reader变量的名U?| ?nbsp; | ?nbsp; |?br />
-------------------------------------------------------------------------------------------
<c:url>标记 创徏链接
使用语法
1 <c:url value="value" [context="context"] [var="name"] [scope="{page|request|session|application}"] />
2 <c:url value="value" [context="context"] [var="name"] [scope="{page|request|session|application}"] />
<c:param />
</c:url>
属?br />
------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; |~省?br />
value | url地址 | ?nbsp; | ?nbsp; |?br />
context | web应用的名?nbsp; | ?nbsp; | ?nbsp; |当前web应用的名?br />
var | 保存url地址的变量的名称 | ?nbsp; | ?nbsp; |输出到当前页?br />
scope | 存储url地址的变量的作用范围 | ?nbsp; | ?nbsp; |page
-------------------------------------------------------------------------------------------
<c:url var="website" value="http://localhost:8080/webproject/out.jsp">
<c:param name="p" value="hello" />
</c:url>
${website }<br>
<a href=" ${website }">dddd</a>
--------------------------------------------------------------------------------
<c:redirect>标记 面跌{
使用语法
1 <c:redirect url="value" [context="context"] />
2 <c:redirect url="value" [context="context"]>
<c:param />
</c:redirect>
属?br />
------------------------------------------------------------------------------------------
属性名 | 描述 | 必?nbsp; |~省?br />
url | url地址 | ?nbsp; |?br />
context | 要{向到的web应用的名?nbsp; | ?nbsp; |当前web应用的名?br />
-------------------------------------------------------------------------------------------
<c:redirect url="LoopTag.jsp">
<c:param name="p" value="aa" />
</c:redirect>
-------------------------------------------------------------------------------
Format标记?br />
-----------------------------------------
国际化有?nbsp; | 旉日期有关(一般不在页面作处理)
setLocale | formatNumber
requestEncoding | formatDate
bundle | parseDate
message | parseNumber
param | setTimeZone
setBundle | timeZone
-----------------------------------------
<fmt:setLocale>标记 讄国际化语a
使用语法
<fmt:setLocale value="locale" [variant="variant"] [scope="{page|request|session|application}"] />
属?br />
---------------------------------------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; |~省?br />
value | 表示该语a环境的一个字W串Q或者是java.util.Localecȝ对象 | 可以 | ?nbsp; |?br />
scope | 指定q个对象的作用范_(d)有效gؓ(f)page,requset,session,applicattion | ?nbsp; | ?nbsp; |page
variant | q一步针对特定的q_或供应商定制语言环境。如,MAC和W(xu)IN分别对应Macintosh和W(xu)indowsq_ | 可以 | ?nbsp; |?br />
---------------------------------------------------------------------------------------------------------------------------
<fmt:setBundle>标记 讑֮国际化资源束的位|?br />
使用语法
<fmt:setBundle basename="basename" [var="name"] [scope="{page|request|session|application}"] />
属?br />
---------------------------------------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; |~省?br />
basename | 讄使用的资源文件束文g的\径与名称Q不应当包含M本地化后~或文件扩展名 | 可以 | ?nbsp; |?br />
var | 讄?jin)该属性,那么把basename属性所标识的资源束赋给该属性值所命名的变?nbsp; | ?nbsp; | ?nbsp; |?br />
scope | 指明~省资源束设|所应用的JSP作用?nbsp; | ?nbsp; | ?nbsp; |page
---------------------------------------------------------------------------------------------------------------------------
束文件名resources_zh_CN.properties(basename属?
<fmt:setBundle basename="com.v512.examples.resources" />
<fmt:bundle>标记 讑֮某个面或某几行国际化资源束的位|?br />
使用语法
<fmt:bundle basename="basename" [prefix="prefix"]>
body content
<fmt:bundle>
属?br />
---------------------------------------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; |~省?br />
basename | 讄使用的资源文件束文g的\径与名称Q不应当包含M本地化后~或文件扩展名 | 可以 | ?nbsp; |?br />
prefix | 为所嵌套?lt;fmt:message>标记的key值指定缺省前~ | 可以 | ?nbsp; |?br />
---------------------------------------------------------------------------------------------------------------------------
<fmt:message>标记 (核心(j))讄资料束文件中的KEY和对应的内容
使用语法
1 <fmt:message key="messageKey" [bundle="resourceBundle"] [var="varName"] [scope="{page|request|session|application}"] />
2 <fmt:message [bundle="resourceBundle"] [var="varName"] [scope="{page|request|session|application}"]>
key
[<fmt:param>]
</fmt:message>
属?br />
-----------------------------------------------------------------------------------------------------------------------------------------------
属性名 | 描述 | EL | 必?nbsp; |~省?br />
key | 用来定在资源束中定义哪个文本消息进行输出显C?nbsp; | 可以 | ?nbsp; |?br />
bundle | 用来指定一个显式的资源?用来查找由key属性标识的消息.h?该属性的值必L实际的资源束. | 可以 | ?nbsp; |?br />
| 如当指定<fmt:setBundle>操作的var属性时同该标记所赋予的资源束.<fmt:message>的bundle属性不支持字符串?nbsp;
var | 该标记所生成的文本消息赋l指定的变量,而不是输出到JSP面?nbsp; | ?nbsp; | ?nbsp; |?br />
scope | 由来指定的var属性指定的变量的作用域,有效?page,request,session,application | ?nbsp; | ?nbsp; |page
-----------------------------------------------------------------------------------------------------------------------------------------------
<fmt:requestEncoding>标记 讄~码方式
使用语法
<fmt:requestEncoding [value="charsetName"] />
作用{同?br />
request.setCharacterEncoding()
--------------------------------------------------------------------------------
<fmt:param>标记 讄~码方式
使用语法
1 <fmt:param value="messageParameter" />
2 <fmt:param>
body content
</fmt:param>
-----------------------------------------------------------------
<fmt:formatDate> 标记
使用Ҏ(gu):
<fmt:formatDate value="${today}" type="date" />
<fmt:formatDate value="${today}" dateStyle="full" />
<fmt:formatDate value="${today}" pattern="yyyy/MM/dd HH:mm:ss" />
<fmt:formatDate value="${today}" pattern="yyyy/MM/dd HH:mm:ss" var="d"/>
----------------------------------------------------------------------------
属性名 | 描述 | ?nbsp; |l果
value | 要格式化的日期?| default |2008-8-1
type | 昄的日期格?nbsp; | date |2008-8-1
| | time |14:47:59
| | both |2008-8-1 14:47:59
dateStyle | 昄的日期格?nbsp; | short |08-8-1
| | medium |2008-8-1
| | long |2008q???br />
| | full |2008q???星期一
pattern | 定义日期格式 |yyy/MM/dd HH:mm:ss |2008/08/01 14:47:59
var | 保存值变量名 | |
scope | 保存变量的scope | |
-----------------------------------------------------------------------------
<fmt:formatNumber> 标记
<fmt:formatNumber value="${n}" pattern="###,###.##"/>
<fmt:formatNumber value="${n}" pattern="###,###.0000"/>
----------------------------------------------------------------------------
属性名 | 描述 | ?nbsp; |l果
value | 要格式化的日期?| default |123,456.123
type | 昄的数据格?nbsp; | number(数字) |123,456.123
| | currency(货币) |K?23,456.123
| | percent(癑ֈ? |23.33%
groupingUsed| 是否分组昄 | true/false |
pattern | 定义数据格式 |###,###.## |123,456.123
| |###,###.0000 |123,456.1230
var | 保存值变量名 | |
scope | 保存变量的scope | |
-----------------------------------------------------------------------------
<format>标记例子
1 建立resources.properties文g(英文)
内容:guestbook.display.welcome=welcome to my website
2 建立resources.properties_zh_CN.properties文g(中文)
Ҏ(gu):
(1)在(f)时目录下建立一个(f)时文件resources_t.properties
内容:guestbook.display.welcome=Ƣ迎大家讉K|站
(2)在DOS下进行该临时目录,执行DOS命今
c:\temp>native2ascii -encoding uft-8 resources_t.properties resources_zh_CN.properties
(3){换好的文件复制到目目录?br />
3 建立JSP面
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
fmt:bundle basename="com.tags.resources">
<fmt:message key="guestbook.display.welcome">
</fmt:message>
</fmt:bundle>
-----------------------------------------------------------------------------------------------------------
<sql>标签
<setDatasource>
<update>
<query>
<param>
1 导入sql的jar?br />
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource driver="" url="" user="" password="" var="" scope=""/>
<sql:update var="oerder" dataSource="${conn}">
insert into BookOrder(username,zipcode,phone,creditcard,total)
values(?,?,'88888833333','123432432423',50.00)
<sql:param value="accp"/>
<sql:param value="1111"/>
</sql:update>
<sql:query var="rs" dataSource="${conn}">
select * from aa
</sql:query>
<C:forEach var="row" items="${rs.rows}">
${row.username} ${row.password}
</c:forEach>
//讑֮JSP不用JSP EL
当前面页不?br />
<%@page isELIgnored="true"%>
整个WEB应用不用JSP EL
修改web.xml
<web-app...>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
</web-app>
----------------------------------------------------
pageContext.setAttribute("username",null)//false
pageContext.setAttribute("username","")//false
${empty username}//判断username是否为空
---------------------------------------------------
pageContext.setAttribute("username","janly")
request.setAttribute("username","janly")
session.setAttribute("username","janly")
application.setAttribute("username","janly")
${pageScope.username}
${requestScope.username}
${sessionScope.username}
${applicationScope.username}
${username}按作用域范围找查
-----------------------------------------
web.xml
<context-param>
<param-name>repeat</param-name>
<param-value>100</param-value>
</context-param>
${initParam.repeat}
${param.username}
---------------------------------