??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品欧美一区二区三区不卡,亚洲午夜精品国产,国产精品xxxxhttp://www.aygfsteel.com/jacally/category/19412.htmlJava原生?/description>zh-cnWed, 19 Mar 2008 03:22:10 GMTWed, 19 Mar 2008 03:22:10 GMT60[导入]WebService开发笔?2 -- VS 2005 讉KWebServcie更简?/title><link>http://www.aygfsteel.com/jacally/articles/186656.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Sun, 16 Mar 2008 13:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/jacally/articles/186656.html</guid><wfw:comment>http://www.aygfsteel.com/jacally/comments/186656.html</wfw:comment><comments>http://www.aygfsteel.com/jacally/articles/186656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jacally/comments/commentRss/186656.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jacally/services/trackbacks/186656.html</trackback:ping><description><![CDATA[<br /> |站: <a >JavaEye</a>  作? <a >jacally</a>  链接Q?a style="color: red" >http://lib.javaeye.com/blog/170628</a>  发表旉: 2008q?3?2?<br /> <br /> 声明Q本文系JavaEye|站发布的原创博客文章,未经作者书面许可,严禁M|站转蝲本文Q否则必追I法律责任! <br /> <br /> 1.首先在vs中新建项?<br /> <img alt="" src="http://lib.javaeye.com/upload/picture/pic/9222/0f3a1ad5-34c4-35b0-94d0-52d6cd25e7a1.jpg?1205321363" /> <br /> <br /> 2.dweb引用.... <br /> <img alt="" src="http://lib.javaeye.com/upload/picture/pic/9220/e5e21986-a77f-3918-8b12-8290e62456a1.jpg?1205321362" /> <br /> <br /> 3.输入WebService地址Qhttp://88.148.29.54:8080/aio/services/WebServiceSample?wsdl最后点?#8220;d引用” <br /> <img alt="" src="http://lib.javaeye.com/upload/picture/pic/9218/d394c612-a53d-340a-bc28-fb405952b9b8.jpg?1205321361" /> <br /> <br /> 4.创徏一个简单的form <br /> <img alt="" src="http://lib.javaeye.com/upload/picture/pic/9216/7be4342c-d86e-3dec-a7fd-325a2257f0b7.jpg?1205321360" /> <br /> <br /> 5.~写按钮事g代码 <br /> <br /> <pre class="c#" name="code">using System;<br /> using System.Collections.Generic;<br /> using System.ComponentModel;<br /> using System.Data;<br /> using System.Drawing;<br /> using System.Text;<br /> using System.Net;<br /> <br /> using System.Windows.Forms;<br /> <br /> <br /> using WindowsApplication1.WebReference;<br /> <br /> namespace WindowsApplication1<br /> {<br /> public partial class Form1 : Form<br /> {<br /> WindowsApplication1.WebReference.WebServiceSampleImplService service = null;<br /> <br /> public Form1()<br /> {<br /> <br /> InitializeComponent();<br /> }<br /> <br /> private void button1_Click(object sender, EventArgs e)<br /> {<br /> <br /> <br /> String str = "";<br /> <br /> try<br /> {<br /> str = service.say("Libin");<br /> <br /> }<br /> catch (Exception we)<br /> {<br /> str = we.Message;<br /> }<br /> <br /> //MessageBox.Show(str);<br /> <br /> textBox1.Text = str ;<br /> <br /> <br /> }<br /> <br /> private void Form1_Load(object sender, EventArgs e)<br /> {<br /> service = new WebServiceSampleImplService();<br /> <br /> label1.Text = "WS.url:" + service.Url + "\r\n";<br /> <br /> }<br /> <br /> private void button2_Click(object sender, EventArgs e)<br /> {<br /> String str = "";<br /> <br /> try<br /> {<br /> User user = new User();<br /> user.id = 1;<br /> user.name = "Libin";<br /> str = "userName:" + service.sayUserName(user);<br /> <br /> }<br /> catch (Exception we)<br /> {<br /> str = we.Message;<br /> }<br /> <br /> //MessageBox.Show(str);<br /> <br /> textBox1.Text = str;<br /> }<br /> <br /> private void button3_Click(object sender, EventArgs e)<br /> {<br /> <br /> String str = "";<br /> try<br /> {<br /> <br /> Object[] users = service.findUsers();<br /> for (int i = 0; i < users.Length; i++)<br /> {<br /> User user = (User)users[i];<br /> str += "id:"+user.id + " name:" + user.name + "\r\n";<br /> }<br /> <br /> }<br /> catch (Exception we)<br /> {<br /> str = we.Message;<br /> }<br /> <br /> //MessageBox.Show(str);<br /> <br /> textBox1.Text = str;<br /> }<br /> }<br /> }</pre> <br /> <br /> 6.最后点击调试运行,或按F5q行Q通过点击按钮可以看到调用WebService的运行结果了 <br /> <img alt="" src="http://lib.javaeye.com/upload/picture/pic/9214/d4de199c-d6e7-3e39-a69f-494a38b972c9.jpg?1205321360" /> <br /> <span style="color: red"><a style="color: red" >本文的讨Z很精彩,览讨论>></a> </span><br /> <br /> <br /> <span style="color: #e28822">JavaEye推荐</span> <br /> <a href="/adverts/41" target="_blank"><span style="font-weight: bold; color: red">中国领先的电(sh)子商务网站-淘宝|招贤纳士,诚聘Java工程?/span></a> <br /> <br /> <br /> <br /> 文章来源:<a >http://lib.javaeye.com/blog/170628</a> <img src ="http://www.aygfsteel.com/jacally/aggbug/186656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jacally/" target="_blank">Lib</a> 2008-03-16 21:41 <a href="http://www.aygfsteel.com/jacally/articles/186656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService开发笔?1 -- 利用cxf开发WebService竟然如此?/title><link>http://www.aygfsteel.com/jacally/articles/186655.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Sun, 16 Mar 2008 13:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/jacally/articles/186655.html</guid><wfw:comment>http://www.aygfsteel.com/jacally/comments/186655.html</wfw:comment><comments>http://www.aygfsteel.com/jacally/articles/186655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jacally/comments/commentRss/186655.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jacally/services/trackbacks/186655.html</trackback:ping><description><![CDATA[现在的项目中需要用到SOA概念的地方越来越?最q我接手的一个项目中提Zq样的业务要?需要在.net开发的客户端系l中讉Kjava开发的webpȝ,q样的业务需求自焉要通过WebServiceq行信息数据的操作。下面就我们在开发中摸烦的一点经验教训ȝ以下Q以供大家参? <br /> <br /> 我们目的整个架构用的比较行的WSH MVCl合,即webwork2 + Spring + Hibernate; <br /> 1.首先集成Apacha CXF WebService ?Spring 框架? <br /> apache cxf 下蝲地址:<a target="_blank">http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip</a> <br /> 在spring context配置文g中引入以下cxf配置 <br /> <pre class="xml" name="code"> <import resource="classpath*:META-INF/cxf/cxf.xml" /><br /> <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" /><br /> <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" /><br /> </pre> <br /> 在web.xml中添加过滤器: <br /> <pre class="xml" name="code"> <servlet><br /> <servlet-name>CXFServlet</servlet-name><br /> <servlet-class><br /> org.apache.cxf.transport.servlet.CXFServlet<br /> </servlet-class><br /> </servlet><br /> <servlet-mapping><br /> <servlet-name>CXFServlet</servlet-name><br /> <url-pattern>/services/*</url-pattern><br /> </servlet-mapping><br /> </pre> <br /> <br /> 2.开发服务端WebService接口: <br /> <pre class="java" name="code">/**<br /> * WebService接口定义c?<br /> * <br /> * 使用@WebService接口中的所有方法输Zؓ(f)Web Service.<br /> * 可用annotation对设|方法、参数和q回值在WSDL中的定义.<br /> */<br /> @WebService<br /> public interface WebServiceSample {<br /> <br /> <br /> /**<br /> * 一个简单的Ҏ(gu),q回一个字W串<br /> * @param hello<br /> * @return<br /> */<br /> String say(String hello);<br /> <br /> /**<br /> * E微复杂一些的Ҏ(gu),传递一个对象给服务端处?br /> * @param user<br /> * @return<br /> */<br /> String sayUserName(<br /> @WebParam(name = "user") <br /> UserDTO user);<br /> <br /> /**<br /> * 最复杂的方?q回一个List装的对象集?br /> * @return<br /> */<br /> public <br /> @WebResult(partName="o")<br /> ListObject findUsers();<br /> <br /> }<br /> </pre> <br /> q单到复杂定义了三个接?模拟业务需? <br /> <br /> 3.实现接口 <br /> <pre class="java" name="code">/**<br /> * WebService实现c?<br /> * <br /> * 使用@WebService指向Interface定义cd?<br /> */<br /> @WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")<br /> public class WebServiceSampleImpl implements WebServiceSample {<br /> <br /> public String sayUserName(UserDTO user) {<br /> return "hello "+user.getName();<br /> }<br /> <br /> public String say(String hello) {<br /> return "hello "+hello;<br /> }<br /> <br /> public ListObject findUsers() {<br /> ArrayList<Object> list = new ArrayList<Object>();<br /> <br /> list.add(instancUser(1,"lib"));<br /> list.add(instancUser(2,"mld"));<br /> list.add(instancUser(3,"lq"));<br /> list.add(instancUser(4,"gj"));<br /> ListObject o = new ListObject();<br /> o.setList(list);<br /> return o;<br /> }<br /> <br /> private UserDTO instancUser(Integer id,String name){<br /> UserDTO user = new UserDTO();<br /> user.setId(id);<br /> user.setName(name);<br /> return user;<br /> }<br /> }<br /> </pre> <br /> <br /> 4.依赖的两个类:用户对象与List对象 <br /> <pre class="java" name="code">/**<br /> * Web Service传输User信息的DTO.<br /> * <br /> * 分离entitycMweb service接口间的耦合Q隔lentitycȝ修改Ҏ(gu)口的影响.<br /> * 使用JAXB 2.0的annotation标注JAVA-XML映射Q尽量用默认约?<br /> * <br /> */<br /> @XmlAccessorType(XmlAccessType.FIELD)<br /> @XmlType(name = "User")<br /> public class UserDTO {<br /> <br /> protected Integer id;<br /> <br /> protected String name;<br /> <br /> public Integer getId() {<br /> return id;<br /> }<br /> <br /> public void setId(Integer value) {<br /> id = value;<br /> }<br /> <br /> public String getName() {<br /> return name;<br /> }<br /> <br /> public void setName(String value) {<br /> name = value;<br /> }<br /> }<br /> </pre> <br /> 关于List对象,参照?a target="_blank">有关JWS的一个问?/a>中的描述:DK6.0 自带的WebService?WebMethod的参数好像不能是ArrayList 或者其他List <br /> 传递List需要将List 包装在其他对象内部才?(个h理解 如有不对h? ,我在实践中也遇到了此c问?通过以下装的对象即可以传递List对象. <br /> <pre class="java" name="code">/**<br /> * <p>Java class for listObject complex type.<br /> * <br /> * <p>The following schema fragment specifies the expected content contained within this class.<br /> * <br /> * <pre><br /> * <complexType name="listObject"><br /> * <complexContent><br /> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"><br /> * <sequence><br /> * <element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/><br /> * </sequence><br /> * </restriction><br /> * </complexContent><br /> * </complexType><br /> * </pre><br /> * <br /> * <br /> */<br /> @XmlAccessorType(XmlAccessType.FIELD)<br /> @XmlType(name = "listObject", propOrder = { "list" })<br /> public class ListObject {<br /> <br /> @XmlElement(nillable = true)<br /> protected List<Object> list;<br /> <br /> /**<br /> * Gets the value of the list property.<br /> * <br /> * <p><br /> * This accessor method returns a reference to the live list,<br /> * not a snapshot. Therefore any modification you make to the<br /> * returned list will be present inside the JAXB object.<br /> * This is why there is not a <CODE>set</CODE> method for the list property.<br /> * <br /> * <p><br /> * For example, to add a new item, do as follows:<br /> * <pre><br /> * getList().add(newItem);<br /> * </pre><br /> * <br /> * <br /> * <p><br /> * Objects of the following type(s) are allowed in the list<br /> * {@link Object }<br /> * <br /> * <br /> */<br /> public List<Object> getList() {<br /> if (list == null) {<br /> list = new ArrayList<Object>();<br /> }<br /> return this.list;<br /> }<br /> <br /> public void setList(ArrayList<Object> list) {<br /> this.list = list;<br /> }<br /> <br /> }<br /> </pre> <br /> <br /> 5.WebService 服务?spring 配置文g ws-context.xml <br /> <pre class="xml" name="code"><beans xmlns="http://www.springframework.org/schema/beans"<br /> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br /> xmlns:jaxws="http://cxf.apache.org/jaxws"<br /> xsi:schemaLocation="http://cxf.apache.org/jaxws <a >http://cxf.apache.org/schemas/jaxws.xsd</a> <br /> <a >http://www.springframework.org/schema/beans</a> <br /> http://www.springframework.org/schema/beans/spring-beans.xsd"<br /> default-autowire="byName" default-lazy-init="true"><br /> <br /> <jaxws:endpoint id="webServiceSample"<br /> address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/><br /> <br /> </beans><br /> </pre> <br /> <br /> WebService 客户?spring 配置文g wsclient-context.xml <br /> <pre class="xml" name="code"><beans xmlns="http://www.springframework.org/schema/beans"<br /> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br /> xmlns:jaxws="http://cxf.apache.org/jaxws"<br /> xsi:schemaLocation="http://cxf.apache.org/jaxws <br /> <a >http://cxf.apache.org/schemas/jaxws.xsd</a> <br /> <a >http://www.springframework.org/schema/beans</a> <br /> http://www.springframework.org/schema/beans/spring-beans.xsd"<br /> default-autowire="byName" default-lazy-init="true"><br /> <br /> <!-- ws client --><br /> <bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"<br /> factory-bean="identityValidateServiceClientFactory" factory-method="create" /><br /> <br /> <bean id="identityValidateServiceClientFactory"<br /> class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"><br /> <property name="serviceClass"<br /> value="cn.org.coral.admin.service.IdentityValidateService" /><br /> <property name="address"<br /> value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/><br /> </bean><br /> <br /> </beans><br /> </pre> <br /> 6.发布到tomcat服务器以后通过以下地址卛_查看自定义的webservice接口生成的wsdl: <br /> http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl <br /> <br /> 7.调用WebService接口的Junit单元试E序 <br /> <pre class="java" name="code">package test.coral.sample;<br /> <br /> import org.springframework.test.AbstractDependencyInjectionSpringContextTests;<br /> <br /> import cn.org.coral.biz.examples.webservice.WebServiceSample;<br /> import cn.org.coral.biz.examples.webservice.dto.UserDTO;<br /> <br /> public class TestWebServiceSample extends<br /> AbstractDependencyInjectionSpringContextTests {<br /> WebServiceSample webServiceSampleClient;<br /> <br /> public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {<br /> this.webServiceSampleClient = webServiceSampleClient;<br /> }<br /> <br /> @Override<br /> protected String[] getConfigLocations() {<br /> setAutowireMode(AUTOWIRE_BY_NAME);<br /> //spring 客户端配|文件保存位|?br /> return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };<br /> }<br /> <br /> public void testWSClinet(){<br /> Assert.hasText(webServiceSampleClient.say(" world"));<br /> }<br /> }<br /> <br /> </pre> <img src ="http://www.aygfsteel.com/jacally/aggbug/186655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jacally/" target="_blank">Lib</a> 2008-03-16 21:40 <a href="http://www.aygfsteel.com/jacally/articles/186655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]CAS 单点d安装W记4 -- asp.net client端的讄http://www.aygfsteel.com/jacally/articles/186657.htmlLibLibSun, 02 Mar 2008 03:52:00 GMThttp://www.aygfsteel.com/jacally/articles/186657.htmlhttp://www.aygfsteel.com/jacally/comments/186657.htmlhttp://www.aygfsteel.com/jacally/articles/186657.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/186657.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/186657.html |站: JavaEye  作? jacally  链接Q?a style="color: red;">http://lib.javaeye.com/blog/166619  发表旉: 2008q?3?2?

声明Q本文系JavaEye|站发布的原创博客文章,未经作者书面许可,严禁M|站转蝲本文Q否则必追I法律责任!

CAS 单点d安装W记4
--- asp.net client端的讄

1、首先修改web.Config文gQ加入以下设|:(x)
<authentication mode="Forms" >
<forms name="casauth" loginUrl="login.aspx" />
</authentication>
<authorization>
<deny users="?" />
</authorization>

本h?net不是很熟(zhn),感觉q里的配|类似java web应用E序中的qo(h)器,当用戯问web|首先跌{到l(f)ogin.aspx面q行验证?

2、加入以下c#代码到l(f)ogin.aspx面的加载事件中Q?
    //CAS w䆾验证 服务器地址
private const string CASHOST = "https://sso.gzps.net:8443/cas/";

protected void Page_Load(object sender, EventArgs e)
{
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();

// Look for the "ticket=" after the "?" in the URL
string tkt = Request.QueryString["ticket"];

// This page is the CAS service=, but discard any query string residue
string service = Request.Url.GetLeftPart(UriPartial.Path);

// First time through there is no ticket=, so redirect to CAS login
if (tkt == null || tkt.Length == 0)
{
string redir = CASHOST + "login?" +
"service=" + service;
Response.Redirect(redir);
return;
}

// Second time (back from CAS) there is a ticket= to validate
string validateurl = CASHOST + "serviceValidate?" +
"ticket=" + tkt + "&"+
"service=" + service;
StreamReader Reader = new StreamReader( new WebClient().OpenRead(validateurl));
string resp = Reader.ReadToEnd();
// I like to have the text in memory for debugging rather than parsing the stream

// Some boilerplate to set up the parse.
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);

string netid = null;

// A very dumb use of XML. Just scan for the "user". If it isn't there, its an error.
while (reader.Read())
{
if (reader.IsStartElement()) {
string tag = reader.LocalName;
if (tag=="user")
netid = reader.ReadString();
}
}
// if you want to parse the proxy chain, just add the logic above
reader.Close();
// If there was a problem, leave the message on the screen. Otherwise, return to original page.
if (netid == null)
{
Label1.Text = "CAS returned to this application, but then refused to validate your identity.";
}
else
{
Session["UserName"] = netid;
Label1.Text = "Welcome " + netid;
FormsAuthentication.RedirectFromLoginPage(netid, false); // set netid in ASP.NET blocks
}

}
}


以上代码参照了ja-sig|站的解x案:(x)http://www.ja-sig.org/wiki/display/CASC/ASP.NET+Forms+Authentication

3、以样就可以了,q行时可以蟩到sso服务器进行验证,但蟩转以后报以下错误Q?
" System.Net.WebException?基础q接已关闭?无法建立与远E服务器信Q关系 "?
应该与CAS Server端安装了数字证书Q?net Client端ƈ没有安装相应的证书有兟?
可以通过配置IIS服务器,支持HTTPS SSL协议实现安全数据交换中介l的步骤导入CAS 服务端的数字证书,或者通过http://support.microsoft.com/kb/823177/上介l的解决Ҏ(gu)q行处理Q?
实现c?
using System.Net;
using System.Security.Cryptography.X509Certificates;

public class MyPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint
, X509Certificate certificate
, WebRequest request
, int certificateProblem) {

//Return True to force the certificate to be accepted.
return true;

} // end CheckValidationResult
} // class MyPolicy


客户端代码中包含下列代码Q?
   System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();


所有代码见附gWebSite.rar,其部vC的IIS服务器就可以了?
关于IIS服务器的讄?a target="_blank">asp.net一夜速成教程
本文的讨Z很精彩,览讨论>>


JavaEye推荐
中国领先的电(sh)子商务网站-淘宝|招贤纳士,诚聘Java工程?/span>



文章来源:http://lib.javaeye.com/blog/166619

Lib 2008-03-02 11:52 发表评论
]]>
[导入]CAS 单点d安装W记3 -- 与acegi集成http://www.aygfsteel.com/jacally/articles/186658.htmlLibLibThu, 28 Feb 2008 15:39:00 GMThttp://www.aygfsteel.com/jacally/articles/186658.htmlhttp://www.aygfsteel.com/jacally/comments/186658.htmlhttp://www.aygfsteel.com/jacally/articles/186658.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/186658.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/186658.html |站: JavaEye  作? jacally  链接Q?a style="color: red;">http://lib.javaeye.com/blog/165980  发表旉: 2008q?2?8?

声明Q本文系JavaEye|站发布的原创博客文章,未经作者书面许可,严禁M|站转蝲本文Q否则必追I法律责任!

CAS 单点d安装W记3
-- 与acegi集成

在我的项目中应用了acigi安全框架,以下是结合yale cas单点dpȝq行的相关配|?
<!-- =========  Acegi as a CAS Client的配|?============ -->
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.cas.CasProcessingFilter">
<property name="authenticationManager"
ref="authenticationManager" />
<property name="authenticationFailureUrl"
value="/login.do?login_error=1" />
<property name="defaultTargetUrl" value="/main.do" />
<property name="filterProcessesUrl">
<value>/j_acegi_cas_security_check</value>
</property>
<property name="rememberMeServices" ref="rememberMeServices" />
<property name="exceptionMappings">
<value>
org.acegisecurity.AuthenticationServiceException=/login.do?login_error=user_not_found_error
org.acegisecurity.BadCredentialsException=/login.do?login_error=user_psw_error
org.acegisecurity.concurrent.ConcurrentLoginException=/login.do?login_error=too_many_user_error
org.acegisecurity.DisabledException=/login.do?login_error=disabled_user_error
</value>
</property>
</bean>
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<ref local="casProcessingFilterEntryPoint"/>
</property>
<property name="accessDeniedHandler">
<bean
class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
<property name="errorPage"
value="/errors/accessDenied.jsp" />
</bean>
</property>
</bean>
<!-- cas config -->
<bean id="casProcessingFilterEntryPoint" class="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint">
<property name="loginUrl"><value>https://sso.gzps.net:8443/cas/login</value></property>
<property name="serviceProperties"><ref local="serviceProperties"/></property>
</bean>
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="casAuthenticationProvider"/>
</list>
</property>
</bean>
<bean id="casAuthenticationProvider" class="org.acegisecurity.providers.cas.CasAuthenticationProvider">
<property name="casAuthoritiesPopulator"><ref bean="casAuthoritiesPopulator"/></property>
<property name="casProxyDecider"><ref local="casProxyDecider"/></property>
<property name="ticketValidator"><ref local="casProxyTicketValidator"/></property>
<property name="statelessTicketCache"><ref local="statelessTicketCache"/></property>
<property name="key"><value>my_password_for_this_auth_provider_only</value></property>
</bean>
<bean id="casProxyTicketValidator" class="org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator">
<property name="casValidate"><value>https://sso.gzps.net:8443/cas/proxyValidate</value></property>
<property name="serviceProperties"><ref local="serviceProperties"/></property>
</bean>
<!--
<bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.AcceptAnyCasProxy" />
-->
<bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.RejectProxyTickets" />
<bean id="serviceProperties" class="org.acegisecurity.ui.cas.ServiceProperties">
<property name="service">
<value>http://localhost:8080/aio/j_acegi_cas_security_check</value>
</property>
<property name="sendRenew">
<value>false</value>
</property>
</bean>
<bean id="statelessTicketCache" class="org.acegisecurity.providers.cas.cache.EhCacheBasedTicketCache">
<property name="cache">
<bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
</property>
<property name="cacheName" value="userCache"/>
</bean>
</property>
</bean>
<bean id="casAuthoritiesPopulator" class="org.acegisecurity.providers.cas.populator.DaoCasAuthoritiesPopulator">
<property name="userDetailsService"><ref local="userDetailsService"/></property>
</bean>

<bean id="casProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter">
<property name="authenticationManager"><ref local="authenticationManager"/></property>
<property name="authenticationFailureUrl"><value>/casfailed.jsp</value></property>
<property name="defaultTargetUrl"><value>/</value></property>
<property name="filterProcessesUrl"><value>/j_acegi_cas_security_check</value></property>
</bean>


<!-- ======================================================= -->


本文的讨Z很精彩,览讨论>>


JavaEye推荐
中国领先的电(sh)子商务网站-淘宝|招贤纳士,诚聘Java工程?/span>



文章来源:http://lib.javaeye.com/blog/165980

Lib 2008-02-28 23:39 发表评论
]]>
[导入]CAS 单点d安装W记2 -- 配置CAS,讉K自己的用戯http://www.aygfsteel.com/jacally/articles/186659.htmlLibLibWed, 27 Feb 2008 09:46:00 GMThttp://www.aygfsteel.com/jacally/articles/186659.htmlhttp://www.aygfsteel.com/jacally/comments/186659.htmlhttp://www.aygfsteel.com/jacally/articles/186659.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/186659.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/186659.html |站: JavaEye  作? jacally  链接Q?a style="color: red;">http://lib.javaeye.com/blog/165538  发表旉: 2008q?2?7?

声明Q本文系JavaEye|站发布的原创博客文章,未经作者书面许可,严禁M|站转蝲本文Q否则必追I法律责任!

CAS 单点d安装W记2


1.修改cas/webapp/WEB-INF/deployerConfigContext.xml
加入以下定义:
	<!-- 数据源定?-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<!--
passwordEncoder 使用Md5法加密
-->
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>


2.屏蔽原有验证Ҏ(gu):
				<!-- 
<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
-->


3.加入通过讉K数据库进行验证的handler:
				<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="sql" value="select password from CORE_USERS where logid=?" />
<property name="passwordEncoder" ref="passwordEncoder"/>
<property name="dataSource" ref="dataSource" />
</bean>


4.修改cas\webapp\WEB-INF\cas.properties,定义数据库连接资?本例子是q接的oracle数据?
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc\:oracle\:thin\:@192.168.1.1\:1521\:xxxx
db.username=xxxx
db.password=xxxx


5.增加相关jar包到cas\webapp\WEB-INF\lib\目录?
cas-server-support-jdbc-3.2.jar (casq接数据库的支持?
ojdbc14.jar (q接oracle数据的jdbc驱动E序)
本文的讨Z很精彩,览讨论>>


JavaEye推荐
中国领先的电(sh)子商务网站-淘宝|招贤纳士,诚聘Java工程?/span>



文章来源:http://lib.javaeye.com/blog/165538

Lib 2008-02-27 17:46 发表评论
]]>
[导入]CAS 单点d安装W记1 -- 基本讄与数字证书的安装http://www.aygfsteel.com/jacally/articles/186660.htmlLibLibTue, 26 Feb 2008 08:35:00 GMThttp://www.aygfsteel.com/jacally/articles/186660.htmlhttp://www.aygfsteel.com/jacally/comments/186660.htmlhttp://www.aygfsteel.com/jacally/articles/186660.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/186660.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/186660.html |站: JavaEye  作? jacally  链接Q?a style="color: red;">http://lib.javaeye.com/blog/165196  发表旉: 2008q?2?6?

声明Q本文系JavaEye|站发布的原创博客文章,未经作者书面许可,严禁M|站转蝲本文Q否则必追I法律责任!

安装JA-SIG SSOpȝW记1

(关于配置讉K数据库的用户表见安装JA-SIG SSOpȝW记2)
(与acegil合配置?a target="_blank">安装JA-SIG SSOpȝW记3)
(ASP.NET client端的讄?a target="_blank">安装JA-SIG SSOpȝW记4)

ps:配置中的文g路径Ҏ(gu)自己的实际情늚讑֮

1.安装JA-SIG ?TOMCAT;
JA-SIG下蝲地址:
http://www.ja-sig.org/products/cas/downloads/index.html

2.生成数字证书,见批处理文g"cas 生成数字证书.bat";

3.配置Tomcat的HTTPS服务,修改server.xml
		<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:/Documents and Settings/Administrator/.keystore" keystorePass="changeit"
truststoreFile="D:/Java/jdk1.6.0_02/jre/lib/security/cacerts"
clientAuth="false" sslProtocol="TLS"/>


4.导出 SERVER 的证书,用来l所有需要用到的客户端导??导出 cas 数字证书.bat"

5.在客L(fng)?JVM 里导入信ȝ SERVER 的证?( Ҏ(gu)情况有可能需要管理员权限 ),?导入 cas 证书.bat"Q?

5.修改客户端服务程?加入casqo(h)?修改web.xml
	<!-- CAS -->
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://sso.gzps.net:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://sso.gzps.net:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>88.148.29.54:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


本文的讨Z很精彩,览讨论>>


JavaEye推荐
中国领先的电(sh)子商务网站-淘宝|招贤纳士,诚聘Java工程?/span>



文章来源:http://lib.javaeye.com/blog/165196

Lib 2008-02-26 16:35 发表评论
]]>
Eclipse 插g集合http://www.aygfsteel.com/jacally/articles/127889.htmlLibLibTue, 03 Jul 2007 08:43:00 GMThttp://www.aygfsteel.com/jacally/articles/127889.htmlhttp://www.aygfsteel.com/jacally/comments/127889.htmlhttp://www.aygfsteel.com/jacally/articles/127889.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/127889.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/127889.htmlhttp://download.macromedia.com/pub/labs/jseclipse/autoinstall/ 
xfire:
 ttp://dist.codehaus.org/xfire/update/
m2eclipse:
http://m2eclipse.codehaus.org/

Lib 2007-07-03 16:43 发表评论
]]>
利用java.util.Collections.sortҎ(gu)排序http://www.aygfsteel.com/jacally/articles/107198.htmlLibLibThu, 29 Mar 2007 05:15:00 GMThttp://www.aygfsteel.com/jacally/articles/107198.htmlhttp://www.aygfsteel.com/jacally/comments/107198.htmlhttp://www.aygfsteel.com/jacally/articles/107198.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/107198.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/107198.html
    //所有选项集合
                List lsDefineOptions = new ArrayList();
                
                
for(int j=0;j<lsOptions.size();j++){
                    Element option 
= (Element) lsOptions.get(j);
                    String label 
= option.getAttributeValue("label");
                    String index 
= option.getAttributeValue("index");
                    String flowstate 
= option.getAttributeValue("flowstate");
                    String querySql 
= option.getChildText("query-sql");
                    
                    
//操作对?/span>
                    SearchOptionDefine defineOption = new SearchOptionDefine();
                    defineOption.setLabel(label);
                    
if(StringUtils.isNotBlank(index)){
                        defineOption.setIndex(Integer.parseInt(index));
                    }

                    
if(StringUtils.isNotBlank(flowstate)){
                        defineOption.setFlowstate(Integer.parseInt(flowstate));
                    }

                    defineOption.setQuerySql(querySql);
                    Log.debug(
"querySql:"+querySql);
                    
                    lsDefineOptions.add(defineOption);
                }

                
                
//所有选项集合的排?/span>
                java.util.Collections.sort(lsDefineOptions);
操作对?/span>SearchOptionDefine 必须实现Comparable接口
package com.mip.core.objects;

import java.io.Serializable;

/**
 * <p> 
 * 主题查询对象
 * </p>
 * 
@author Libin
 * @date Mar 29, 2007
 * 
@version 4.0
 *
 * 
@see AnotherClass
 
*/

public class SearchOptionDefine implements Serializable,Comparable {

    
/**
     * 
     
*/

    
private static final long serialVersionUID = 3256440313546683697L;

    
/** A int variable 所有状态标?/span>*/
    
public static final int ALL_STATE=999;
    
    
/**
     * Constructs a SearchDefine
     
*/

    
public SearchOptionDefine(){
        index
=0;
        flowstate
=ALL_STATE;
    }

    
    
/**
     * 主题查询的每一定?
    *    label:对应下拉框显C的中文名称
    *    index:排序序号
    *    flowstate:对应程状?l合程状态来定是否昄当前选项
    *    query_sql:原生SQL语句,主题查询的条?br>    
*/
    
    
private String label;
    
private Integer index;
    
private Integer flowstate;
    
private String querySql;
    
    
public Integer getFlowstate() {
        
return flowstate;
    }

    
public void setFlowstate(Integer flowstate) {
        
this.flowstate = flowstate;
    }

    
public Integer getIndex() {
        
return index;
    }

    
public void setIndex(Integer index) {
        
this.index = index;
    }

    
public String getLabel() {
        
return label;
    }

    
public void setLabel(String label) {
        
this.label = label;
    }

    
public String getQuerySql() {
        
return querySql;
    }

    
public void setQuerySql(String query_sql) {
        
this.querySql = query_sql;
    }

    
    
public int compareTo(Integer arg0) {
        
return index.compareTo(arg0);
    }

    
    
public int compareTo(Object obj) {
        
// TODO Auto-generated method stub
        return (this.getIndex() - ((SearchOptionDefine)obj).getIndex());
    }

    
    
    
}



Lib 2007-03-29 13:15 发表评论
]]>
permgen space报错http://www.aygfsteel.com/jacally/articles/103988.htmlLibLibThu, 15 Mar 2007 03:56:00 GMThttp://www.aygfsteel.com/jacally/articles/103988.htmlhttp://www.aygfsteel.com/jacally/comments/103988.htmlhttp://www.aygfsteel.com/jacally/articles/103988.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/103988.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/103988.html http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html


PermGen space的全U是Permanent Generation space,是指内存的永久保存区?br />OutOfMemoryError: PermGen space从表面上看就是内存益出,解决Ҏ(gu)也一定是加大
内存。说说ؓ(f)什么会(x)内存益出Q这一部分用于存放Class和Meta的信?Class在被 Load
的时候被攑օPermGen space区域Q它和和存放Instance的Heap区域不同,GC(Garbage
Collection)不会(x)在主E序q行期对PermGen spaceq行清理Q所以如果你的APP?x)LOAD
很多CLASS的话,很可能出现PermGen space错误。这U错误常见在web服务器对JSPq?br />行pre compile的时候?/p>

Ҏ(gu)Ҏ(gu)Q?Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m


q里以tomcat环境ZQ其它WEB服务器如jboss,weblogic{是同一个道理?br />一、java.lang.OutOfMemoryError: PermGen space

PermGen space的全U是Permanent Generation space,是指内存的永久保存区?
q块内存主要是被JVM存放Class和Meta信息?Class在被Loader时就?x)被攑ֈPermGen
space?
它和存放cd?Instance)的Heap区域不同,GC(Garbage Collection)不会(x)在主E序q?br />行期?br />PermGen spaceq行清理Q所以如果你的应用中有很多CLASS的话,很可能出现PermGen
space错误,
q种错误常见在web服务器对JSPq行pre compile的时候。如果你的WEB APP下都用了?br />量的W三方jar, 其大?br />过了jvm默认的大?4M)那么׃(x)产生此错误信息了?br />解决Ҏ(gu)Q?手动讄MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行Q?br />JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
Q将相同的第三方jar文gUȝ到tomcat/shared/lib目录下,q样可以辑ֈ减少
jar 文档重复占用内存的目的?/p>

Lib 2007-03-15 11:56 发表评论
]]>
JSTL语言详解(摘抄)http://www.aygfsteel.com/jacally/articles/102997.htmlLibLibSat, 10 Mar 2007 07:42:00 GMThttp://www.aygfsteel.com/jacally/articles/102997.htmlhttp://www.aygfsteel.com/jacally/comments/102997.htmlhttp://www.aygfsteel.com/jacally/articles/102997.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/102997.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/102997.html正在处理(zhn)的h...
JSP 标准标记库(JSP Standard Tag LibraryQ?a >JSTLQ是一个实?Web 应用E序中常见的通用功能的定制标记库集,q些功能包括q代和条件判断、数据管理格式化?a >XML 操作以及(qing)数据库访问。在 developerWorks 上其新系列的W一文章中QY件工E师 Mark Kolb 向?zhn)展示了如何?JSTL 标记来避免在 JSP 面中用脚本编制元素。?zhn)q将了解如何通过从表C层删除源代码来化Y件维护。最后,(zhn)将了解 JSTL l过化的表达式语aQ它允许在不必用功能齐全的~程语言的情况下?JSTL 操作指定动态属性倹{?br />
  JavaServer PagesQJSPQ是用于 J2EE q_的标准表C层技术。JSP 技术提供了用于执行计算Q这些计用来动态地生成面内容Q的脚本~制元素和操作。脚本编制元素允许在 JSP 面中包括程序源代码Q在为响应用戯求而呈现页面时可以执行q些源代码。操作将计算操作装到很?HTML ?XML 标记的标CQJSP 面的模板文本通常包含q些标记。JSP 规范只将几种操作定义成了标准Q但?JSP 1.1 开始,开发h员已l能够以定制标记库的方式创徏其自q操作了?br />
  JSP 标准标记库(JSTLQ是 JSP 1.2 定制标记库集Q这些标记库实现大量服务器端 Java 应用E序常用的基本功能。通过为典型表C层dQ如数据格式化和q代或条件内容)提供标准实现Q?a >JSTL ?JSP 作者可以专注于特定于应用程序的开发需求,而不是ؓ(f)q些通用操作“另L(fng)灶”?br />
  当然Q?zhn)可以使?JSP 脚本~制元素Qscriptlet、表辑ּ和声明)来实现此cMQ务。例如,可以使用三个 scriptlet 实现条g内容Q清?1 中着重显CZq三?scriptlet。但是,因ؓ(f)脚本~制元素依赖于在面中嵌入程序源代码Q通常?Java 代码Q,所以对于用这些脚本编制元素的 JSP 面Q其软gl护d的复杂度大大增加了。例如,清单 1 中的 scriptlet CZ严格C赖于花括L(fng)正确匚w。如果不l意间引入了一个语法错误,则条件内容中的嵌套其?scriptlet 可能?x)造成严重破坏Qƈ且在 JSP 容器~译该页面时Q要使所产生的错误信息有意义可能?x)很困难?br />
  清单 1. 通过 scriptlet 实现条g内容 <% if (user.getRole() == "member")) { %>

<p>Welcome, member!</p><% } else { %>    <p>Welcome, guest!</p><% } %>


  修正此类问题通常需要相当丰富的~程l验。尽通常?x)由十分_N页面布局和图形设计的设计人员来开发和l护 JSPQ但是同一面中的脚本~制元素出现问题Ӟ需要程序员的介入。这U状况将单个文g中代码的责Q分担l多人,因而得开发、调试和增强此类 JSP 面成ؓ(f)很麻烦的d。通过常用功能包装到定制标记库的标准集合中,JSTL ?JSP 作者可以减对~制脚本元素的需求,甚至可以不需要它们,q免了相关的维护成本?/ccid_code>

  JSTL 1.0

  JSTL 1.0 发布?2002 q?6 月,由四个定制标记库Qcore、format、xml ?sqlQ和一寚w用标记库验证器QScriptFreeTLV ?PermittedTaglibsTLVQ组成。core 标记库提供了定制操作Q通过限制了作用域的变量管理数据,以及(qing)执行面内容的P代和条g操作。它q提供了用来生成和操?URL 的标记。顾名思义Qformat 标记库定义了用来格式化数据(其是数字和日期Q的操作。它q支持用本地化资源束进?JSP 面的国际化。xml 库包含一些标讎ͼq些标记用来操作通过 XML 表示的数据,?sql 库定义了用来查询关系数据库的操作?br />
  两个 JSTL 标记库验证器允许开发h员在?JSP 应用E序中强制用编码标准。可以配|?ScriptFreeTLV 验证器以?JSP 面中禁用各U类型的 JSP 脚本元素 ?scriptlet、表辑ּ和声明。类似地QPermittedTaglibsTLV 验证器可以用来限制可能由应用E序?JSP 面讉K的定制标记库集(包括 JSTL 标记库)?br />
  管 JSTL 最l将?x)成?J2EE q_的必需lgQ但目前只有数应用E序服务器包括它?a >JSTL 1.0 的参考实现可作ؓ(f) Apache 软g基金?x)(Apache Software FoundationQ的 Jakarta Taglibs 目Q请参阅参考资料)的一部分而获得。可以将该参考实C的定制标记库合ƈCQ何支?JSP 1.2 ?Servlet 2.3 规范的服务器Q以d?JSTL 的支持?/ccid_code>

  表达式语a

  ?JSP 1.2 中,可以使用静态字W串或表辑ּQ如果允许的话)指定 JSP 操作的属性。例如,在清?2 中,?<jsp:setProperty> 操作?name ?property 属性指定了静态|而用表达式指定了?value 属性。这个操作的效果是将h参数的当前D予命名的 bean Ҏ(gu)。以q种形式使用的表辑ּ被称求时属性|request-time attribute valueQ,q是构徏?JSP 规范中的用于动态指定属性值的唯一机制?br />
  清单 2. 合ƈh时属性值的 JSP 操作


<jsp:setProperty name="user" property="timezonePref"                 value='<%= request.getParameter("timezone") %>'/>


  因ؓ(f)h时属性值是用表辑ּ指定的,所以它们往往有和其它脚本元素一L(fng)软gl护问题。因此,JSTL 定制标记支持另一U用于指定动态属性值的机制。可以用化的表达式语aQELQ而不使用完整?JSP 表达式来指定 JSTL 操作的属性倹{EL 提供了一些标识符、存取器和运符Q用来检索和操作ȝ?JSP 容器中的数据。EL 在某U程度上?EcmaScriptQ请参阅参考资料)?XML 路径语言Q?a >XML Path LanguageQXPathQؓ(f)基础Q因此页面设计h员和E序员都应该熟?zhn)它的语法。EL 擅长L对象?qing)其?gu),然后对它们执行简单操作;它不是编E语aQ甚至不是脚本编制语a。但是,?JSTL 标记一起用时Q它?yu)p使用单而又方便的符h表示复杂的行为。EL 表达式的格式是这L(fng)Q用元W号Q?Q定界,内容包括在花括号Q{}Q中Q如清单 3 所C?br />
  清单 3. 说明 EL 表达式定界符?JSTL 操作

  <c:out value="${user.firstName}"/>


  此外Q?zhn)可以多个表辑ּ与静态文本组合在一起以通过字符串ƈ|来构造动态属性|如清?4 所C。单独的表达式由标识W、存取器、文字和q算W组成。标识符用来引用存储在数据中心中的数据对象。EL ?11 个保留标识符Q对应于 11 ?EL 隐式对象。假定所有其它标识符都引用限制了作用域的变量。存取器用来索对象的Ҏ(gu)或集合的元素。文字表C固定的??数字、字W、字W串、布?yu)(dng)型或空倹{运符允许Ҏ(gu)据和文字q行l合以及(qing)比较?br />
  清单 4. l合静态文本和多个 EL 表达式以指定动态属性?br />
  <c:out value="Hello ${user.firstName} ${user.lastName}"/>


  限制了作用域的变?/b>

  JSP API 通过 <jsp:useBean> 操作允许?JSP 容器内的四个不同作用域中存储和检索数据?a >JSTL 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展q一能力。此外,EL 提供这些对象作为限制了作用域的变量q行索的内置支持。特别地QQ何出现在 EL 表达式中但不对应于Q?EL 隐式对象的标识符Q都被自动假定ؓ(f)引用存储在四?JSP 作用域的其中某个中的对象Q这四个作用域是Q?/ccid_code>

  ·面作用?br />
  ·h作用?br />
  ·?x)话作用?br />
  ·应用E序作用?br />
  (zhn)可能还记得Q只有在为特定请求处理页面期间才能检索存储在该页面作用域中的对象。如果对象是存储在请求作用域中的Q可以在处理所有参与处理某h的页面期间检索这些对象(譬如在对某个h的处理中遇到了一个或多个 <jsp:include> ?<jsp:forward> 操作Q。如果对象是存储在会(x)话作用域中的Q则在与 Web 应用E序的交互式?x)话期间Q可以由用户讉K的Q何页面检索它Q即Q直C该用户交互相兌?HttpSession 对象无效为止Q。可以由M用户从Q何页面访问存储在应用E序作用域中的对象,直到卸蝲 Web 应用E序本n为止Q通常是由于关?JSP 容器所_(d)?br />
  通过字W串映射为期望作用域中的对象来将对象存储到该作用域。然后,可以通过提供相同字符串来从该作用域检索该对象。在作用域的映射中查扑֭W串Qƈq回被映的对象。在 Servlet API 中,此cd象称为相应作用域的属性。但是,?EL 的上下文中,也将与属性相兌的字W串看作变量的名Uͼ该变量通过属性映的方式获得特定的倹{?br />
  ?EL 中,与隐式对象无兌的标识符被认为是存储在四?JSP 作用域中的名U对象。首先对面作用域检查是否存在这L(fng)标识W,其次对请求作用域、然后对?x)话作用域、最后对应用E序作用域依ơ进行这L(fng)查,然后试该标识符的名U是否与存储在该作用域中的某个对象的名称匚w。第一个这L(fng)匚w作ؓ(f) EL 标识W的Dq回。通过q种Ҏ(gu)Q可以将 EL 标识W看作引用限制了作用域的变量?br />
  从更技术的斚w来说Q没有映到隐式对象的标识符是用 PageContext 实例?findAttribute() Ҏ(gu)求值的Q该实例表示寚w面的处理Q在该页面上Q当前正在处理用于请求的表达式。标识符的名UC为参C递给q个Ҏ(gu)Q然后该Ҏ(gu)依次在四个作用域中搜索具有相同名U的属性。ƈ所扑ֈ的第一个匹配项作ؓ(f) findAttribute() Ҏ(gu)的D回。如果未在这四个作用域中扑ֈq样的属性,则返?null?br />
  最l,限制了作用域的变量是四个 JSP 作用域的属性,q些属性具有可以用?EL 标识W的名称。只要对限制了作用域的变量赋予由字母数字l成的名Uͼ可以通过 JSP 中提供的用于讄属性的M机制来创建它们。这包括内置?<jsp:useBean> 操作Q以?qing)?Servlet API 中的几个cd义的 setAttribute() Ҏ(gu)。此外,四个 JSTL 库中定义的许多定制标记本w就能够讄作ؓ(f)限制了作用域的变量用的属性倹{?/ccid_code>

  隐式对象

  ?1 中列Z 11 ?EL 隐式对象的标识符。不要将q些对象?JSP 隐式对象Q一共只有九(ji)个)hQ其中只有一个对象是它们所共有的?br />
  ?1. EL 隐式对象

  cd    标识W             描述

  JSP    pageContext   PageContext 实例对应于当前页面的处理

  作用域  pageScope     与页面作用域属性的名称和值相兌?Map c?br />
       requestScope   与请求作用域属性的名称和值相兌?Map c?br />
       sessionScope   与会(x)话作用域属性的名称和值相兌?Map c?br />
       applicationScope 与应用程序作用域属性的名称和值相兌?Map c?br />
  h参数 param      按名U存储请求参数的主要值的 Map c?br />
       paramValues  请求参数的所有g?String 数组存储?Map c?br />
  h? header     按名U存储请求头主要值的 Map c?br />
       headerValues 请求头的所有g?String 数组存储?Map c?br />
  Cookie  cookie     按名U存储请求附带的 cookie ?Map c?br />
  初始化参?initParam   按名U存?Web 应用E序上下文初始化参数?Map c?br />
     管 JSP ?EL 隐式对象中只有一个公共对象(pageContextQ,但通过 EL 也可以访问其?JSP 隐式对象。原因是 pageContext 拥有讉K所有其它八?JSP 隐式对象的特性。实际上Q这是将它包括在 EL 隐式对象中的主要理由?br />
  其余所?EL 隐式对象都是映射Q可以用来查扑֯应于名称的对象。前四个映射表示先前讨论的各U属性作用域。可以用它们来查扄定作用域中的标识W,而不用依赖于 EL 在缺省情况下使用的顺序查找过E?br />
  接下来的四个映射用来获取h参数和请求头的倹{因?HTTP 协议允许h参数和请求头h多个|所以它们各有一Ҏ(gu)。每对中的第一个映返回请求参数或头的主要|通常是恰巧在实际h中首先指定的那个倹{每对中W二个映允许检索参数或头的所有倹{这些映中的键是参数或头的名称Q但q些值是 String 对象的数l,其中的每个元素都是单一参数值或头倹{?br />
  cookie 隐式对象提供了对p求设|的 cookie 名称的访问。这个对象将所有与h相关联的 cookie 名称映射到表C那?cookie Ҏ(gu)的 Cookie 对象?br />
  最后一?EL 隐式对象 initParam 是一个映,它储存与 Web 应用E序相关联的所有上下文的初始化参数的名U和倹{初始化参数是通过 web.xml 部v描述W文件指定的Q该文g位于应用E序?WEB-INF 目录中?/ccid_code>

  存取?/b>

  因ؓ(f) EL 标识W是作ؓ(f)隐式对象或限制了作用域的变量Q通过属性来实现Q解析的Q因此有必要它们{换成 Java 对象。EL 可以自动包装和解包其相应?Java cM的基本类型(例如Q可以在后台?int 强制转换?Integer c,反之亦可Q,但大多数的标识符成为指向完整的 Java 对象的指针?br />
  l果是,对这些对象的Ҏ(gu)或Q在对象是数l和集合的情况下Q对其元素的讉K通常是o(h)人满意的。就Z实现q种用途,EL 提供了两U不同的存取器(点运符Q?Q和Ҏ(gu)可符Q[]Q)Q也支持通过 EL 操作Ҏ(gu)和元素?br />
  点运符通常用于讉K对象的特性。例如,在表辑ּ ${user.firstName} 中,使用点运符来访?user 标识W所引用对象的名?firstName 的特性。EL 使用 Java bean U定讉K对象Ҏ(gu),因此必须定义q个Ҏ(gu)的 getter Ҏ(gu)Q通常是名?getFirstName() 的方法)Q以便表辑ּ正确求倹{当被访问的Ҏ(gu)本w是对象Ӟ可以递归地应用点q算W。例如,如果我们虚构?user 对象有一个实Cؓ(f) Java 对象?address Ҏ(gu),那么也可以用点运符来访问这个对象的Ҏ(gu)。例如,表达?${user.address.city} 会(x)q回q个地址对象嵌套?city Ҏ(gu)?br />
  Ҏ(gu)可符用来索数l和集合的元素。在数组和有序集合(也即Q实C java.util.List 接口的集合)的情况下Q把要检索的元素的下标放在方括号中。例如,表达?${urls[3]} q回 urls 标识W所引用的数l或集合的第四个元素Q和 Java 语言以及(qing) JavaScript 中一PEL 中的下标是从零开始的Q?br />
  对于实现 java.util.Map 接口的集合,Ҏ(gu)可符使用兌的键查找存储在映中的倹{在Ҏ(gu)号中指定键,q将相应的g辑ּ的D回。例如,表达?${commands["dir"]} q回?commands 标识W所引用?Map 中的 "dir" 键相兌的倹{?br />
  对于上述两种情况Q都可允许表辑ּ出现在方括号中。对嵌套表达式求值的l果被作ؓ(f)下标或键Q用来检索集合或数组的适当元素。和点运符一PҎ(gu)可符也可以递归应用。这使得 EL 能够从多l数l、嵌套集合或两者的Ll合中检索元素。此外,点运符和方括号q算W还可以互操作。例如,如果数组的元素本w是对象Q则可以使用Ҏ(gu)可符来检索该数组的元素,q结合点q算W来索该元素的一个特性(例如 ${urls[3].protocol}Q?br />
  假定 EL 充当指定动态属性值的化语aQEL 存取器有一个有的功能Q与 Java 语言的存取器不同Q,那就是它们在应用?null 时不抛出异常。如果应?EL 存取器的对象Q例如,${foo.bar} ?${foo["bar"]} 中的 foo 标识W)?nullQ那么应用存取器的结果也?null。事实证明,在大多数情况下,q是一个相当有用的行ؓ(f)Q不久?zhn)׃?x)了解q一炏V?br />
  最后,点运符和方括号q算W可能实现某U程度的互换。例如,也可以?${user["firstName"]} 来检?user 对象?firstName Ҏ(gu),正如可以?${commands.dir} 获取?commands 映射中的 "dir" 键相兌的g栗?/ccid_code>

  q算W?/b>

  EL q可以通过使用标识W和存取器,遍历包含应用E序数据Q通过限制了作用域的变量公开Q或关于环境的信息(通过 EL 隐式对象Q的对象层次l构。但是,只是讉Kq些数据Q通常不以实现许?JSP 应用E序所需的表C逻辑?br />
  最l,EL q包括了几个用来操作和比?EL 表达式所讉K数据的运符。表 2 中汇Mq些q算W?br />
  ?2. EL q算W?br />
  cd     q算W?br />
  术q算W  +???Q或 divQ和 %Q或 modQ?br />
  关系q算W? ==Q或 eqQ?=Q或 neQ?lt;</code>Q或 ltQ?gt;Q或 gtQ?lt;=Q或 leQ和 >=Q或 geQ?br />
  逻辑q算W  &&Q或 andQ、||Q或 orQ和 !Q或 notQ?br />
  验证q算W? empty


  术q算W支持数值的加法、减法、乘法和除法。还提供了一个求余运符。注Q除法和求余q算W都有替代的、非W号的名Uͼ为的是与 XPath 保持一_(d)。清?5 中显CZ一个演C算术运符用法的示例表辑ּ。对几个 EL 表达式应用算术运符的结果是该术q算W应用于q些表达式返回的数值所得的l果?br />
  清单 5. 利用术q算W的 EL 表达?br />
${item.price * (1 + taxRate[user.address.zipcode])}


  关系q算W允许比较数字或文本数据。比较的l果作ؓ(f)布尔D回。逻辑q算W允许合q布?yu)(dng)|q回新的布尔倹{因此,可以?EL 逻辑q算W应用于嵌套的关pL逻辑q算W的l果Q如清单 6 所C?br />
  清单 6. 利用关系和逻辑q算W的 EL 表达?br />
${(x >= min) && (x <= max)}


  最后一U?EL q算W是 emptyQ它对于验证数据特别有用。empty q算W采用单个表辑ּ作ؓ(f)其变量(也即Q?{empty input}Q,q返回一个布?yu)(dng)|该布?yu)(dng)DC对表达式求值的l果是不是“空”倹{求值结果ؓ(f) null 的表辑ּ被认为是I,x元素的集合或数组。如果参数是寚w度ؓ(f)零的 String 求值所得的l果Q则 empty q算W也返?true?br />
  ?3 昄?EL q算W的优先U。正如清?5 ?6 所C,可以用圆括号对表辑ּ分组Q高于普通的优先U规则?br />
  ?3. EL q算W优先Q自到底,从左到右Q?br />
[], . () unary -、not?、empty *?、div?、mod +、binary - () <</code>?gt;?lt;=?gt;=、lt、gt、le、ge ==?=、eq、ne &&、and ||、or


  文字

  ?EL 表达式中Q数字、字W串、布?yu)(dng)值和 null 都可以被指定为文字倹{字W串可以用单引号或双引号定界。布?yu)(dng)D指定?true ?false?br />
  Taglib 伪指?/b>

  正如我们先前讨论的,JSTL 1.0 包括四个定制标记库。ؓ(f)了演C?JSTL 标记和表辑ּ语言的交互,我们研I几个来?JSTL core 库的标记。和使用M JSP 定制标记库一P必须在?zhn)惌使用q个库标记的M面中包?taglib 伪指令。清?7 昄了用于这个特定库的伪指o(h)?br />
  清单 7. 用于 JSTL core ?EL 版本?taglib 伪指?br />
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>


  实际上,对应?JSTL core 库的 taglib 伪指令有两种Q因为在 JSTL 1.0 中,EL 是可选的。所有四?JSTL 1.0 定制标记库都有?JSP 表达式(而不?ELQ指定动态属性值的备用版本。因些备用库依赖?JSP 的更传统的请求时属性|所以它们被UCؓ(f) RT 库,而那些用表辑ּ语言的则被称?EL 库。开发h员用不同?taglib 伪指令来区分每个库的q两个版本。清?8 昄了?core 库的 RT 版本的伪指o(h)。但是,׃现在我们讨论的重Ҏ(gu) ELQ所以首先需要这些伪指o(h)?br />
  清单 8. 用于 JSTL core ?RT 版本?taglib 伪指?/ccid_code>

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %>


  变量标记

  我们首先要考虑?JSTL 定制标记?<c:set> 操作。正如已l说明的Q限制了作用域的变量?JSTL 中v关键作用Q?lt;c:set> 操作提供Z标记的机制来创徏和设|限制了作用域的变量。清?9 中显CZ该操作的语法Q其?var 属性指定了限制了作用域的变量的名称Qscope 属性表明了该变量驻留在哪个作用域中Qvalue 属性指定了分配l该变量的倹{如果指定变量已l存在,则简单地所指明的Dl它。如果不存在Q则创徏新的限制了作用域的变量,q用该值初始化q个变量?br />
  清单 9. <c:set> 操作的语?/ccid_code>

<c:set var="name" scope="scope" value="expression"/>


  scope 属性是可选的Q其~省值是 page?br />
  清单 10 中显CZ <c:set> 的两个示例。在W一个示例中Q将?x)话作用域变量设|成 String 倹{在W二个示例中Q用表达式来讄数|(x)页面作用域内名?square 的变量赋gؓ(f)名ؓ(f) x 的请求参数的值的qx?br />
  清单 10. <c:set> 操作CZ


<c:set var="timezone" scope="session" value="CST"/><c:set var="square" value="${param['x'] * param['x']}"/>


  (zhn)还可以限制了作用域的变量的值指定ؓ(f) <c:set> 操作的主体内容,而不是用属性。用这U方法,(zhn)可以重新编写清?10 中的W一个示例,如清?11 所C。此外,正如我们马上可以看到的,<c:set> 标记的主体内Ҏ(gu)w也可以使用定制标记?lt;c:set> M内生成的所有内定w作Z?String Dl指定变量?br />
  清单 11. 通过M内容指定 <c:set> 操作的?/ccid_code>

<c:set var="timezone" scope="session">CST</c:set>


  JSTL core 库包含第二个用于理限制了作用域的变量的标记 ?<c:remove>。顾名思义Q?lt;c:remove> 操作是用来删除限制了作用域的变量的,它获取两个属性。var 属性指定待删除变量的名Uͼscope 属性是可选的Q它表示待删除变量来自哪个作用域Q缺省ؓ(f) pageQ如清单 12 所C?br />
  清单 12. <c:remove> 操作CZ


<c:remove var="timezone" scope="session"/>


  输出

  管 <c:set> 操作允许表辑ּl果赋给限制了作用域的变量,但开发h员通常?x)希望只昄表达式的|而不存储它?a >JSTL <c:out> 定制标记承担q一dQ其语法如清?13 所C。该标记对由?value 属性指定的表达式进行求|然后打印l果。如果指定了可选属?defaultQ那么,在对 value 属性的表达式求值所得结果ؓ(f) null 或空 String 的情况下Q?lt;c:out> 打印其倹{?br />
  清单 13. <c:out> 操作的语?/ccid_code>

<c:out value="expression" default="expression" escapeXml="boolean"/>


  escapeXml 属性也是可选的。它控制当用 <c:out> 标记输出诸如?lt;”、?gt;”和?amp;”之cȝ字符Q在 HTML ?XML 中具有特D意义)时是否应该进行{义。如果将 escapeXml 讄?trueQ则?x)自动将q些字符转换成相应的 XML 实体Q此处提到的字符分别转换?&lt;?amp;gt; ?&amp;Q?br />
  例如Q假定有一个名?user 的会(x)话作用域变量Q它是一个类的实例,该类为用户定义了两个Ҏ(gu):(x)username ?company。每当用戯问站Ҏ(gu)Q这个对象被自动分配l会(x)话,但直到用户实际登录后Q才?x)设|这两个Ҏ(gu)。假定是q种Ҏ(gu)Q请考虑清单 14 中的 JSP 片段。在用户d之后Q这个片D将昄单词“Hello”,其后是他Q她的用户名和一个惊叹号。但是,在用L(fng)录之前,p个片D는成的内容则是短语“Hello Guest!”。在q种情况下,因ؓ(f) username Ҏ(gu)还有待初始化,所?<c:out> 标记{而打印出 default 属性的|卛_W串“Guest”)?br />
  清单 14. 带缺省内容的 <c:out> 操作CZ Hello


<c:out value="${user.username}" default=="Guest"/>!


  接下来,考虑清单 15Q它使用?<c:out> 标记?escapeXml 属性。如果在q种情况下已l将 company Ҏ(gu)设|成 Java String ?"Flynn & Sons"Q那么,实际上该操作生成的内容将?Flynn & Sons。如果这个操作是生成 HTML ?XML 内容?JSP 面的一部分Q那么,q个字符串中间的?amp;”符hl可能被解释?HTML ?XML 控制字符Q从而妨了对该内容的显C或解析。但是,如果?escapeXml 属性D|成 trueQ则所生成的内容将?Flynn &amp; Sons。浏览器或解析器不会(x)因在解释旉到这U内容而出问题。假?HTML ?XML ?JSP 应用E序中最常见的内容类型,所?escapeXml 属性的~省值是 true ׃ؓ(f)奇了?br />
  清单 15. 用转义?<c:out> 操作CZ


<c:out value="${user.company}" escapeXml=="false"/>


  用缺省D|变?/b>

  除了化动态数据的昄之外Q当通过 <c:set> 讄变量值时Q?lt;c:out> 指定~省值的能力也很有用。正如清?11 所C,用来赋给限制了作用域的变量的值可以指定ؓ(f) <c:set> 标记的主体内容,也可以通过其值属性来指定。通过?<c:out> 操作嵌套?<c:set> 标记的主体内容中Q变量赋值就可以利用其缺省D力?br />
  清单 16 中说明了q种Ҏ(gu)。外?<c:set> 标记的行为非常简单:(x)它根据其M内容讄?x)话作用?timezone 变量的倹{但是,在这U情况下Q主体内Ҏ(gu)通过 <c:out> 操作生成的。这个嵌套操作的值属性是表达?${cookie['tzPref'].value}Q它?yu)试通过 cookie 隐式对象q回名ؓ(f) tzPref ?cookie 倹{(cookie 隐式对象?cookie 名称映射到相应的 Cookie 实例Q这意味着必须通过对象?value Ҏ(gu)用点q算W来索储存在 cookie 中的实际数据。)

  清单 16. 合ƈ <c:set> ?<c:out> 以提供缺省变量?/ccid_code>

<c:set var="timezone" scope=="session">   <c:out value="${cookie['tzPref'].value}" default=="CST"/></c:set>


  但是Q请考虑以下情况Q用hW一ơ尝试用这D代码的 Web 应用E序。结果是Q请求中没有提供名ؓ(f) tzPref ?cookie。这意味着使用隐式对象的查扑ְq回 nullQ在q种情况下整个表辑ּ返?null。因为对 <c:out> 标记?value 属性求值的l果?nullQ所?<c:out> 标记?x){而输出对?default 属性求值的l果。在q里是字W串 CST。因此,实际的结果是?timezone 限制了作用域的变量设|成用户?tzPref cookie 中存储的时区Q或者,如果没有Q则使用~省时区 CST?/ccid_code>

  EL ?JSP 2.0

  目前Q表辑ּ语言仅可用于指定 JSTL 定制标记中的动态属性倹{但 JSTL 1.0 表达式语a的一个扩展已l被提出Q会(x)把它包括?JSP 2.0 中去Q眼下正在进行最后评审。这个扩展将允许开发h员通过自己的定制标记来使用 EL。页面作者将可以在目前允怋?JSP 表达式的M地方使用 EL 表达式,譬如动态值插入模板文本中Q?lt;p>Your preferred time zone is ${timezone}</p>?br />
  q个 JSP 2.0 功能Q就?JSTL 本n一P支持页面作者进一步减对 JSP ~制脚本元素的依赖,从而改q?JSP 应用E序的可l护性?/ccid_code>

  l束?/b>

  ELQ与四个 JSTL 定制标记库提供的操作l合hQ允?dng)R面作者不使用脚本元素卛_实现表示层逻辑。例如,Ҏ(gu)本文开头清?1 中的 JSP 代码和清?17 中显C的通过 JSTL 实现的同样功能。(JSTL core 库中其余的标讎ͼ包括 <c:choose> ?qing)其子标讎ͼ在本系列的下一文章中讨论。)管昄执行了条仉辑Q但?JSTL 版本中没?Java 语言源代码,q且标记之间的关p(其是关于嵌套需求)对于M_N?HTML 语法的h都应该是熟?zhn)的?br />
  清单 17. 合ƈ <c:set> ?<c:out> 以提供缺省变量?/ccid_code>

<c:choose><c:when test="${user.role == 'member'}">    <p>Welcome, member!</p>  </c:when><c:otherwise>    <p>Welcome, guest!</p>  </c:otherwise></c:choose>


  通过提供大多?Web 应用E序常用功能的标准实玎ͼJSTL 有助于加速开发周期。与 EL l合hQ?a >JSTL 可以不需要对表示层程序编写代码,q极大地化了 JSP 应用E序的维护?/ccid_code>

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=193676





Lib 2007-03-10 15:42 发表评论
]]>JSTL语法?qing)参?[转]http://www.aygfsteel.com/jacally/articles/96691.htmlLibLibTue, 30 Jan 2007 03:49:00 GMThttp://www.aygfsteel.com/jacally/articles/96691.htmlhttp://www.aygfsteel.com/jacally/comments/96691.htmlhttp://www.aygfsteel.com/jacally/articles/96691.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/96691.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/96691.htmlJSTL语法?qing)参?br />作?胡祥?/p>

JSTL语法?qing)参?br />JSTL包含以下的标{?
常用的标{:(x)?lt;c:out>?lt;c:remove>?lt;c:catch>?lt;c:set>{?br />条g标签Q如<c:if><c:when>?lt;c:choose>?lt;c:otherwise>{?br />URL标签Q如<c:import>?lt;c:redirect>?lt;c:url>{?br />XML标签Q如<xml:out>{?br />国际化输出标{:(x)?lt;fmt:timeZone>{?br />SQL标签Q如<sql:query>?lt;sql:update>?lt;sql:transaction>{?/p>


一般用途的标签:
1Q?lt;c:out>
没有Body时的语法
<c:out value=”value?[escapeXml=”{true|false}”] [default=”defaultValue”]/>
有Body时的语法
<c:out value=”value?[escapeXml=”{true|false}”]>
q里是Body部分
</c:out>

 

名字 cd 描述
value Object 要输出的表辑ּ
escapeXml boolean 定以下字符:<,>,&,?”在字符串中是否被除敎ͼ默认为true
default Object 如果vaule计算后的l果是nullQ那么输个默认?

 

2Q?lt;c:set>
q个标签用于在某个范?page、request、session、application{?中用某个名字设定特定的|或者设定某个已l存在的javabean对象的属性。他cM?lt;%request.setAttrbute(“name?”value?;%>
语法1Q用value属性设定一个特定范围中的属性?
<c:set value=”value?var=”varName?[scope=”{page|request|session|application}”]/>
语法2Q用value属性设定一个特定范围中的属性,q带有一个Body?
<c:set var=”varName?[scope=”{page|request|session|application}”]>
Body部分
</c:set>
语法3Q设|某个特定对象的一个属性?
<c:set value=”value?target=”target?property=”propertyName?>
语法4Q设|某个特定对象的一个属性,q带有一个Body?
<c:set target=”target?property=”propertyName?gt;
Body部分
</c:set>

 

名字 cd 描述
value Object 要计算的表到式?
var String 用于表示value 值的属性,如果要在其他标签中用,是通过q?个var指定的值来q行的。它相当于在标签定义了一个变量,q且q个变量只能在标{中的一个?
scope String var的有效范_(d)可以是page|request|session|application中的一?
target String 要讄属性的对象Q它必须是javabean或则java.util.Map对象
property Object 待设定的Target对象中的属性名字,比如在javabean中有个name属性,提供了setUserIdҎ(gu)Q那么这里填userId?

 

3Q?lt;c:remove>
<c:remove var=”varName?[scope=”{page|request|session|application}”]/>

 

4Q?lt;c:catch>
q个标签相当于捕获在它里边的标签抛出的异常对?
<c:catch [var=”varName”]> //var是异常的名字
内容
</c:catch>

 

条g标签
1Q?<c:if>
语法1Q无Body情况
<c:if test=”testCondition?var=”varName?[scope=”page|request|session|application”]/>
语法2Q有Body的情?
<c:if test=”testCondition?var=”varName?[scope=”page|request|session|application”]>
Body内容
</c:if>

 

名字 cd 描述
test Boolean 表达式的条gQ相当于if()中的条g判断语句?
var String 表示q个语句的名字?
scope String varq个变量的作用范围?

 

2Q?lt;c:choose>
语法Q?lt;c:choose>
Body内容(<c:when>?lt;c:otherwise>子标{?
</c:choose>
注意Q它的Body只能׃下元素组?
1) I格
2) 0或多?lt;c:when>子标{,<c:when>必须?lt;c:otherwise>标签之前出现.
3) 0个或多个<c:otherwise>子标{?

 

3Q?lt;c:when>
代表的是<c:choose>的一个条件分?只能?lt;c:choose>中?
语法Q?lt;c:when test=”testCondition?gt; //test是booleancd,用于判断条g真假
Body语句
</c:when>

 

4Q?lt;c:otherwise>
代表的是<c:choose>中的最后选择。必d最后出?
<c:otherwise>
内容
</c:otherwise>

 

q代标签
1Q?lt;c:forEach>
语法1Q在Collection中P?
<c:forEach[var=”varName”] items=”collection?[varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]
Body内容
</c:foeEach>

 

语法2QP代固定的ơ数.
<c:forEach [var=”varName”] [varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]
Body内容
</c:foeEach>

 

名字 cd 描述
var String q代的参敎ͼ它是标签参数Q在其他标签中通过它来引用q个标签中的内容?
Items Collection、ArrayList?要P代的items集合.
Iterator、Map、String?
Eunmeration{?
VarStatus String 表示q代的状态,可以讉Kq代自n的信?
Begin int 表示开始P代的位置?
End int 表示l束q代的位|?
Step int 表示q代Ud的步长,默认??

 

URL相关的标{?
1Q?lt;c:import>
语法1Q资源的内容使用String对象向外暴露
<c:import url=”url?[context=”context”]
[var=”varName”] [scope=”{page|request|session|application}”] [charEncoding=”charEncoding”]>
内容
</c:import>

 

语法2Q资源的内容使用Reader对象向外暴露?
<c:import url=”url?[context=”context”]
varReader=”varReaderName?[charEncoding=”charEncoding”]>
内容
</c:import>
名字 cd 描述
url String 待导入资源的URLQ可以是相对路径和绝对\径,q且可以导入其他L资源
context String 当用相对\径访问外部context资源Ӟcontext指定了这个资源的名字?
var String 参数的名字?
scope String var参数的作用范围?
cahrEncoding String 输入资源的字W编码?
varReader String q个参数的类型是Reader,用于d资源?

 

2Q?lt;c:redirct>
语法1:没有Body的情?
<c:redirect url=”value?[context=”context”]/>
语法2Q有Body情况下,在Body中指定查询的参数
<c:redirect url=”value?[context=”context”]>
<c:param name=”name?value=”value?>
</c:redirect>

 

3Q?lt;c:url>
语法1Q没有Body
<c:url value=”value?[context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]/>
语法2Q有Body
<c:url value=”value?[context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]>
<c:param name=”name?value=”value?>
</c:url>

 

名字 cd 描述
value String URL?
context String 当用相对\径访问外部context资源Ӟcontext指定了这个资源的名字
var String 标识q个URL标量?
Scope String 变量作用范围?

 

SQL相关的标{?
1Q?lt;sql:setDataSource>
2Q?lt;sql:query>
3Q?lt;sql:update>
4Q?lt;transaction>
5Q?lt;param>



Lib 2007-01-30 11:49 发表评论
]]>
使用java.util.Timer [转]http://www.aygfsteel.com/jacally/articles/95382.htmlLibLibMon, 22 Jan 2007 09:43:00 GMThttp://www.aygfsteel.com/jacally/articles/95382.htmlhttp://www.aygfsteel.com/jacally/comments/95382.htmlhttp://www.aygfsteel.com/jacally/articles/95382.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/95382.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/95382.html在应用开发中Q经帔R要一些周期性的操作Q比如每5分钟查一下新邮g{。对于这L(fng)操作最方便、高效的实现方式是使用java.util.Timer工具cR比如下面的代码?分钟查一遍是否有新邮Ӟ(x)

         private  java.util.Timer timer; 
        timer 
=   new  Timer( true ); 
        timer.schedule(
new  java.util.TimerTask() 
            
public   void  run() 
                    
// server.checkNewMail(); 查新邮g 
            }
 
        }
0 5 * 60 * 1000 ); 

 

使用q几行代码之后,Timer本n?x)每?分钟调用一遍server.checkNewMail()Ҏ(gu)Q不需要自己启动线E。Timer本n也是多线E同步的Q多个线E可以共用一个TimerQ不需要外部的同步代码?br />    在《The Java Tutorial》中有更完整的例子:(x)

public   class  AnnoyingBeep 
    Toolkit toolkit; 
    Timer timer; 
  
    
public  AnnoyingBeep() 
    toolkit 
=  Toolkit.getDefaultToolkit(); 
        timer 
=   new  Timer(); 
        timer.schedule(
new  RemindTask(), 
                   
0 ,         // initial delay 
                    1 * 1000 );   // subsequent rate 
    }
 
  
    
class  RemindTask  extends  TimerTask 
    
int  numWarningBeeps  =   3
  
        
public   void  run() 
        
if  (numWarningBeeps  >   0
            toolkit.beep(); 
        System.out.println(
" Beep! " ); 
        numWarningBeeps
--
        }
  else  
            toolkit.beep();  
                System.out.println(
" Time′s up! " ); 
            
// timer.cancel();  // Not necessary because we call System.exit 
            System.exit( 0 );    // Stops the AWT thread (and everything else) 
        }
 
        }
 
    }
 
     
}
 


q段E序Q每?U响铃一壎ͼq打印出一行消息。@?ơ。程序输出如下:(x)
Task scheduled.
Beep!     
Beep!      //one second after the first beep
Beep!      //one second after the second beep
Time′s up! //one second after the third beep

TimercM可以方便地用来作为gq执行,比如下面的代码gq指定的旉Q以Uؓ(f)单位Q执行某操作。类似电(sh)视的延迟x功能?br />

 
public   class  ReminderBeep 
     
    
public  ReminderBeep( int  seconds) 
    toolkit 
=  Toolkit.getDefaultToolkit(); 
        timer 
=   new  Timer(); 
        timer.schedule(
new  RemindTask(), seconds * 1000 ); 
    }
 
  
    
class  RemindTask  extends  TimerTask 
        
public   void  run() 
            System.out.println(
" Time′s up! " ); 
        toolkit.beep(); 
        
// timer.cancel();  // Not necessary because we call System.exit 
        System.exit( 0 );    // Stops the AWT thread (and everything else) 
        }
 
    }
 
     
}
 


 



Lib 2007-01-22 17:43 发表评论
]]>
使用java.util.Timer [转]http://www.aygfsteel.com/jacally/articles/95383.htmlLibLibMon, 22 Jan 2007 09:43:00 GMThttp://www.aygfsteel.com/jacally/articles/95383.htmlhttp://www.aygfsteel.com/jacally/comments/95383.htmlhttp://www.aygfsteel.com/jacally/articles/95383.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/95383.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/95383.html在应用开发中Q经帔R要一些周期性的操作Q比如每5分钟查一下新邮g{。对于这L(fng)操作最方便、高效的实现方式是使用java.util.Timer工具cR比如下面的代码?分钟查一遍是否有新邮Ӟ(x)

         private  java.util.Timer timer; 
        timer 
=   new  Timer( true ); 
        timer.schedule(
new  java.util.TimerTask() 
            
public   void  run() 
                    
// server.checkNewMail(); 查新邮g 
            }
 
        }
0 5 * 60 * 1000 ); 

 

使用q几行代码之后,Timer本n?x)每?分钟调用一遍server.checkNewMail()Ҏ(gu)Q不需要自己启动线E。Timer本n也是多线E同步的Q多个线E可以共用一个TimerQ不需要外部的同步代码?br />    在《The Java Tutorial》中有更完整的例子:(x)

public   class  AnnoyingBeep 
    Toolkit toolkit; 
    Timer timer; 
  
    
public  AnnoyingBeep() 
    toolkit 
=  Toolkit.getDefaultToolkit(); 
        timer 
=   new  Timer(); 
        timer.schedule(
new  RemindTask(), 
                   
0 ,         // initial delay 
                    1 * 1000 );   // subsequent rate 
    }
 
  
    
class  RemindTask  extends  TimerTask 
    
int  numWarningBeeps  =   3
  
        
public   void  run() 
        
if  (numWarningBeeps  >   0
            toolkit.beep(); 
        System.out.println(
" Beep! " ); 
        numWarningBeeps
--
        }
  else  
            toolkit.beep();  
                System.out.println(
" Time′s up! " ); 
            
// timer.cancel();  // Not necessary because we call System.exit 
            System.exit( 0 );    // Stops the AWT thread (and everything else) 
        }
 
        }
 
    }
 
     
}
 


q段E序Q每?U响铃一壎ͼq打印出一行消息。@?ơ。程序输出如下:(x)
Task scheduled.
Beep!     
Beep!      //one second after the first beep
Beep!      //one second after the second beep
Time′s up! //one second after the third beep

TimercM可以方便地用来作为gq执行,比如下面的代码gq指定的旉Q以Uؓ(f)单位Q执行某操作。类似电(sh)视的延迟x功能?br />

 
public   class  ReminderBeep 
     
    
public  ReminderBeep( int  seconds) 
    toolkit 
=  Toolkit.getDefaultToolkit(); 
        timer 
=   new  Timer(); 
        timer.schedule(
new  RemindTask(), seconds * 1000 ); 
    }
 
  
    
class  RemindTask  extends  TimerTask 
        
public   void  run() 
            System.out.println(
" Time′s up! " ); 
        toolkit.beep(); 
        
// timer.cancel();  // Not necessary because we call System.exit 
        System.exit( 0 );    // Stops the AWT thread (and everything else) 
        }
 
    }
 
     
}
 


 



Lib 2007-01-22 17:43 发表评论
]]>
用java.util.timer在web工程中实现类D发器的机?[转]http://www.aygfsteel.com/jacally/articles/95380.htmlLibLibMon, 22 Jan 2007 09:35:00 GMThttp://www.aygfsteel.com/jacally/articles/95380.htmlhttp://www.aygfsteel.com/jacally/comments/95380.htmlhttp://www.aygfsteel.com/jacally/articles/95380.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/95380.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/95380.html用java.util.timer在web工程中实现类D发器的机?/p>

 

现在正在做的目要实C个定时出帐的触发? 开始打用spring整合的quartz工具来实?同时spring也提供了对java.util.timer的支?,
spring对quartz整合的方?是在配置文g中通过bean的property设|一个crontrigger表达式来实现_的时点触?但是׃spring只有在启动的时候对注入D行读?q样的话很隑֮现通过q行时读取配|参?辑ֈ不用重启服务卛_改变出帐旉的目?所以只好自己寻扑֥一点的解决Ҏ(gu).

 

在网上找C,看了很受启发,我略做了一些修?实现了在每个月的某一天的某一个时间进行Q务操作的功能.

 

代码?qing)注释如?

 

先要实现一个系l的监听?



/**


title: 



description: 



copyright: copyright (c)chen meng 2005



company: 陈盟 



@author  陈盟
@version  1.0
@since  2005-1-13 / 17:26:41
*/

package  com.wellsoon.cttbj.vab.background;




import  java.util.date;



import  javax.servlet.servletcontextevent;
import  javax.servlet.servletcontextlistener;




public   class  settleaccountlistener  implements  servletcontextlistener {

private  java.util.timer timer  =   null ;




/*  
* @see javax.servlet.servletcontextlistener#contextinitialized(javax.servlet.servletcontextevent)
*/
public   void  contextinitialized(servletcontextevent event) {
date taskrun 
=   null ;

//  todo auto-generated method stub
taskrun  =   new  date();
timer 
=   new  java.util.timer( true );
event.getservletcontext().log(定时器已启动); 
/ 在这里每隔一分钟轮询一ơ出帐Q?如果d间隔比较大的话徏议把q个D的大一?但此讄值将间接影响可设定的触发_ֺ.
timer.schedule(
new  settleaccounttask(),  0 60 * 1000 );  /
event.getservletcontext().log(已经dd调度?;



}



/*  
* @see javax.servlet.servletcontextlistener#contextdestroyed(javax.servlet.servletcontextevent)
*/
public   void  contextdestroyed(servletcontextevent event) {
//  todo auto-generated method stub
timer.cancel();
event.getservletcontext().log(定时器销?;



}



}



接着来看settleaccounttask的实?



/**


title: 



description: 



copyright: copyright (c)chen meng 2005



company: 陈盟 



@author  陈盟
@version  1.0
@since  2005-1-13 / 17:35:55
*/



package  com.wellsoon.cttbj.vab.background;



import  java.util.calendar;
import  java.util.date;
import  java.util.timertask;




public   class  settleaccounttask  extends  timertask {



private   static   boolean  isrunning  =   false ;
private   static   long  dotaskmillis  =   0l ;



public   void  run() {
system.out.println(dotaskmillis); 
// 下面两个g表每月的哪一天几点进行实际Q务操?可以通过数据库查询获?/span>
int  c_schedule_date  =   10 ;
int  c_schedule_hour  =   4 ;
calendar cal 
=  calendar.getinstance();
// 如果d量很?在下ơ轮询时仍在执行上次轮询的Q?则蟩q本ơ执?直接错过.
if  ( ! isrunning) {
// 如果当前pȝ旉的day_of_month和hour_of_day不满以下条?则蟩q实际操?
if  (c_schedule_date  ==  cal.get(calendar.day_of_month) Q& c_schedule_hour  ==  cal.get(calendar.hour_of_day)) {
// 如果上次执行d的时间距此次轮询旉间隔太短,则蟩q实际操?
if ((dotaskmillis  2 * 60 * 60 * 1000 <  cal.gettimeinmillis()) {
//  详细d
isrunning  =   true ;
system.out.println(执行出帐操作);
dotaskmillis 
=  cal.gettimeinmillis();
system.out.println(dotaskmillis);
isrunning 
=   false ;
}
}
else  {
system.out.println(错过);
}
}
}



最?在web.xml中加?/p>

<listener>
  <listener-class>
    com.xxx.background.settleaccountlistener
  </listener-class>
</listener>

 


可以了.
如果有更好的解决方式, 希望(zhn)回?



Lib 2007-01-22 17:35 发表评论
]]>
java 5.0 中的 同步QConcurrentQ?[转]http://www.aygfsteel.com/jacally/articles/95378.htmlLibLibMon, 22 Jan 2007 09:33:00 GMThttp://www.aygfsteel.com/jacally/articles/95378.htmlhttp://www.aygfsteel.com/jacally/comments/95378.htmlhttp://www.aygfsteel.com/jacally/articles/95378.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/95378.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/95378.html9Q ?同步QConcurrentQ?/p>

    
1.      Executor接口

     Executor接口提供了一个类gU程池的理工具。用于只需要往Executor中提交Runnable对象Q剩下的启动U程{工作,都会(x)有对应的实现cL完成。ScheduledExecutorService比ExecutorService增加了,旉上的控制Q即用户可以在提交的时候额外的定义该Q务的启动时机Q以?qing)随后的执行间隔和gq等?/p>

     例子Q?/p>

     dQ?/p>

     public class ETask implements Runnable{

          private int id = 0;

          public ETask(int id){

               this.id = id;

          }

          public void run(){

               try{

                   System.out.println(id+" Start");

                   Thread.sleep(1000);

                   System.out.println(id+" Do");

                   Thread.sleep(1000);

                   System.out.println(id+" Exit");

              }catch(Exception e){

                   e.printStackTrace();

              }

          }

     }

    

     试c:(x)

     public class ETest{

          public static void main(String[] args){       

              ExecutorService executor = Executors.newFixedThreadPool(2);

              for(int i=0;i<5;i++){

                   Runnable r = new ETask(i);

                   executor.execute(r);

              }

              executor.shutdown();

          }

     }

 

     输出Q?/p>

     0 Start

     1 Start

     0 Do

     1 Do

     0 Exit

     2 Start

     1 Exit

     3 Start

     2 Do

     3 Do

     2 Exit

     3 Exit

     4 Start

     4 Do

     4 Exit

 

2.      Future和Callable

     Callable是一个类gRunnable的接口,他与Runnable的区别是Q她在执行完毕之后能够返回结果。Future用于获取U程的执行结果,或者取消已向Executor的Q务。当我们通过Future提供的get()Ҏ(gu)获取d的执行结果时Q如果Q务没有完成,则调用get()Ҏ(gu)的线E将?x)被dQ知道Q务完成ؓ(f)止。一般我们都?x)用Future的实现类FutureTask?/p>

     例子Q?/p>

     Callable对象Q?/p>

     public class ETask implements Callable{

          private String id = null;

          public ETask(String id){

               this.id = id;

          }

    

          public String call(){

              try{

                   System.out.println(id+" Start");

                   Thread.sleep(1000);

                   System.out.println(id+" Do");

                   Thread.sleep(1000);

                   System.out.println(id+" Exit");          

              }catch(Exception e){

                   e.printStackTrace();

              }

              return id;

          }

     }

 

     试c:(x)

     public class ETest{

          public static void main(String[] args){       

              ExecutorService executor = Executors.newFixedThreadPool(2);

              for(int i=0;i<5;i++){           

                   try{

                       Callable c = new ETask(String.valueOf(i));

                        FutureTask ft = new FutureTask(c);

                        executor.execute(ft);

                        System.out.println("Finish:" + ft.get());         

                   }catch(Exception e){

                       e.printStackTrace();

                   }

              }

               executor.shutdown();

          }

     }

 

     输出Q?/p>

     0 Start

     0 Do

     0 Exit

     Finish:0

     1 Start

     1 Do

     1 Exit

     Finish:1

     2 Start

     ?/p>

3.      CompletionService和ExecutorCompletionService

     CompletionServicecM于一个Executor和Queue的؜合。我们可以通过submit()向CompletionService提交dQ然后通过poll()来获取第一个完成的dQ也可以通过take()来阻塞等待下一个完成的d。ExecutorCompletionService是CompletionService的实现类Q他需要提供一个Executor作ؓ(f)构造函数的参数?/p>

     例子Q?/p>

     Executor executor = ?

     CompletionService cs = new ExecutorCompletionService(executor);

     Future fs = cs.submit(?;

     Future ft = cs.take();

 

4.      Semaphore

     信号量是用于同步和互斥的低原语。信号量提供的acquire()和release()操作Q与操作pȝ上的pQv操作同?/p>

     例子Q?/p>

     ~冲区:(x)

     public class Buffer{

          private Semaphore s = null;

          private Semaphore p = null;

          Vector<Integer> v = new Vector<Integer>();

         

          public Buffer(int capacity){

               s = new Semaphore(capacity);

              p = new Semaphore(0);

          }

    

          public void put(int i){

              try{

                   s.acquire();

                   v.add(new Integer(i));

                   p.release();

               }catch(Exception e){

                   e.printStackTrace();

              }

          }

    

          public int get(){ 

               int i = 0;

              try{

                   p.acquire();

                   i = ((Integer)v.remove(0)).intValue();

                   s.release();

              }catch(Exception e){

                   e.printStackTrace();

              }

               return i;

          }   

     }

 

     生者:(x)

     public class Producer extends Thread{

          private Buffer b;

          private int count;

          private int step;

          private int id;

 

          public Producer(Buffer b,int step,int id){

               this.b =  b;

              this.step = step;

              this.id = id;

               count = 0;

          }

    

          public void run(){

              try{

                   while(true){

                       System.out.println("In put");

                        b.put(count);

                        System.out.println("Producer "+id+":"+count);

                        count++;

                       Thread.sleep(step);

                        System.out.println("Out put");

                   }

               }catch(Exception e){

                   e.printStackTrace();

              }

          }

     }

 

     消费者:(x)

     public class Consumer extends Thread{

          private Buffer b;

          private int step;

          private int id;

    

          public Consumer(Buffer b,int step,int id){

              this.b = b;

               this.step = step;

              this.id = id;

          }

         

          public void run(){

              try{

                   while(true){

                        System.out.println("In get");

                       System.out.println("\t\tConsume "+id+":"+b.get());

                        System.out.println("Out get");

                        Thread.sleep(step);

                   }

               }catch(Exception e){

                   e.printStackTrace();

              }   

          }

     }

 

     试E序Q?/p>

     public class CPTest{

          public static void main(String[] args){

               Buffer b = new Buffer(3);

              Consumer c1 = new Consumer(b,1000,1);

              Consumer c2 = new Consumer(b,1000,2);

               Producer p1 = new Producer(b,100,1);

              Producer p2 = new Producer(b,100,2);

        

              c1.start();

               c2.start();

              p1.start();

              p2.start();

          }

     }

 

5.      CyclicBarrier

     CyclicBarrier可以让一l线E在某一个时间点上进行等待,当所有进E都到达该等待点后,再l往下执行。CyclicBarrier使用完以后,通过调用reset()Ҏ(gu)Q可以重用该CyclicBarrier。线E通过调用await()来减计数?/p>

 

CyclicBarrier
 
 

 

 

 

 

 

 

     例子Q?/p>

     dQ?/p>

     public class Task extends Thread{

          private String id;

          private CyclicBarrier c;

          private int time;

    

          public Task(CyclicBarrier c,String id,int time){

               this.c = c;

              this.id = id;

               this.time = time;

          }

    

          public void run(){

               try{

                   System.out.println(id+" Start");

                  Thread.sleep(time);

                   System.out.println(id+" Finish");

                   c.await();

                   System.out.println(id+" Exit");         

               }catch(Exception e){

                   e.printStackTrace();

              }

          }   

     }

 

     试c:(x)

     public class Test{

          public static void main(String[] args){

              CyclicBarrier c = new CyclicBarrier(3,new Runnable(){

                   public void run(){

                        System.out.println("All Work Done");

                   }

              });

               Task t1 = new Task(c,"1",1000);

              Task t2 = new Task(c,"2",3000);

              Task t3 = new Task(c,"3",5000);

               t1.start();

              t2.start();

              t3.start();       

          }

     }

 

     输出l果Q?/p>

     1 Start

     2 Start

     3 Start

     1 Finish

     2 Finish

     3 Finish

     All Work Done

     3 Exit

     1 Exit

     2 Exit

 

6.      CountdownLatch

     CountdownLatchh与CyclicBarrier怼的功能,也能让一l线E在某个点上q行同步。但是与CyclicBarrier不同的是Q?.CountdownLatch不能重用Q?.U程在CountdownLatch上调用await()操作一定会(x)被阻塞,直到计数gؓ(f)0时才?x)被唤醒Q而且计数值只能通过conutDown()Ҏ(gu)q行减少?/p>

特别的,当CountdownLatch的gؓ(f)1Ӟ该Latch被称为“启动大门”,所有Q务线E都在该Latch上await()Q直到某个非dU程调用countDown()触发Q所有Q务线E开始同时工作?/p>

 

7.      Exchanger

     Exchanger是一个类g计数gؓ(f)2的CyclicBarrier。她允许两个U程在某个点上进行数据交换?/p>

       例子Q?/p>

     public class FillAndEmpty {

         Exchanger<DataBuffer> exchanger = new Exchanger();

         DataBuffer initialEmptyBuffer = ... a made-up type

         DataBuffer initialFullBuffer = ...

 

         public class FillingLoop implements Runnable {

              public void run() {

                   DataBuffer currentBuffer = initialEmptyBuffer;

                   try {

                       while (currentBuffer != null) {

                            addToBuffer(currentBuffer);

                            if (currentBuffer.full())

                                 currentBuffer = exchanger.exchange(currentBuffer);

                       }

                   }catch(InterruptedException ex) { ... handle ... }

              }

         }

 

         public class EmptyingLoop implements Runnable {

              public void run() {

                   DataBuffer currentBuffer = initialFullBuffer;

                   try {

                       while (currentBuffer != null) {

                            takeFromBuffer(currentBuffer);

                            if (currentBuffer.empty())

                                 currentBuffer = exchanger.exchange(currentBuffer);

                       }

                   } catch (InterruptedException ex) { ... handle ...}

              }

         }

 

         public void start() {

              new Thread(new FillingLoop()).start();

              new Thread(new EmptyingLoop()).start();

         }

     }

Exchange
 
 

 

    

 

 

 

 

 

 

 

 

8.      LockQCondition

     锁是最基本的同步原语。通过在锁上面调用lock()和unlock()操作Q可以达Csynchronized关键字相似的效果Q但是有一点要注意的是Q锁必须昑ּ释放Q如果由于抛出异常,而没有释NQ将D死锁出现。Condition提供的await(),signal(),signal()操作Q与原来的wai(),notify(),notifyAll()操作h怼的含义。Lock的两个主要子cLReentrantLock和ReadWriteLock。其中ReadWriteLock的作用是允许多h读,而一人写?/p>

     例子Q?/p>

     使用Lock和Condition的生产者,消费者问?/p>

     public class BoundedBuffer {

         final Lock lock = new ReentrantLock();

         final Condition notFull  = lock.newCondition();

         final Condition notEmpty = lock.newCondition();

         final Object[] items = new Object[100];

         int putptr, takeptr, count;

        

         public void put(Object x) throws InterruptedException {

              lock.lock();

              try {

                   while (count == items.length)

                       notFull.await();

                   items[putptr] = x;

                   if (++putptr == items.length)

                        putptr = 0;

                   ++count;

                   notEmpty.signal();

              } finally {

                   lock.unlock();

               }

          }

    

          public Object take() throws InterruptedException {

               lock.lock();

              try {

                   while (count == 0)

                       notEmpty.await();

                   Object x = items[takeptr];

                   if (++takeptr == items.length)

                        takeptr = 0;

                   --count;

                   notFull.signal();

                   return x;

               } finally {

                   lock.unlock();

              }

          }

     }   

 

9.      结Q新的concurrent包提供了一个从低到高的同步操作?/p>

 



Lib 2007-01-22 17:33 发表评论
]]>
Oracle函数列表速查 [转]http://www.aygfsteel.com/jacally/articles/95369.htmlLibLibMon, 22 Jan 2007 08:45:00 GMThttp://www.aygfsteel.com/jacally/articles/95369.htmlhttp://www.aygfsteel.com/jacally/comments/95369.htmlhttp://www.aygfsteel.com/jacally/articles/95369.html#Feedback0http://www.aygfsteel.com/jacally/comments/commentRss/95369.htmlhttp://www.aygfsteel.com/jacally/services/trackbacks/95369.htmlPL/SQL单行函数和组函数详解
 函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏了一pd函数Q这些函数都可被UCؓ(f)SQL或PL/SQL语句Q函C要分Z大类Q?
   单行函数

   l函?

  本文讨论如何利用单行函C?qing)用规则?/p>

  SQL中的单行函数

  SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX{单行函数?br />SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)

  单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>

  NULL和单行函?/p>

  在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ(f)提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ(f)他能直接处理NULL|NVL有两个参敎ͼ(x)NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?/p>

  下面我们看看emp数据表它包含了薪水、奖金两,需要计ȝ补偿
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2

  不是单的薪水和奖金加v来就可以了,如果某一行是null值那么结果就是nullQ比如下面的例子Q?br />update empset salary=(salary+bonus)*1.1

  q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃(x)得出错误的结论,q个时候就要用nvl函数来排除null值的影响?br />所以正的语句是:(x)
update empset salary=(salary+nvl(bonus,0)*1.1
单行字符串函?/p>

  单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串

  ASCII()
  c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122

  CHR(QiQ?[NCHAR_CS]
  i是一个数字,函数q回十进制表C的字符
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B

  CONCAT(,)
  c1,c2均ؓ(f)字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓ(f)nullQ则q回null。他和操作符||q回的结果相?br />select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda

  INITCAP()
  c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?br />select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici

  INSTR(,[,QiQ[,]])
  c1,c2均ؓ(f)字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ(f)1.
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2

  INSTRB(,[,i[,j])
  与INSTRQ)函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()

  LENGTH()
  c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?br />select LENGTH('Ipso Facto') ergo from dualergo10

  LENGTHb()
  与LENGTH()一Pq回字节?/p>

  lower()
  q回c的小写字W,l常出现在where子串?br />select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite

  LPAD(,QiQ[,])
  c1,c2均ؓ(f)字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ(f)单空|参见RPAD?br />select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe

  LTRIM(,)
  把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃?x)改变?br />select LTRIM('Mississippi','Mis') from dualLTRppi

  RPAD(,QiQ[,])
  在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ(f)单空?其他与LPAD怼

  RTRIM(,)
  把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃?x)改变?/p>

  REPLACE(,[,])
  c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?br />select REPLACE('uptown','up','down') from dualREPLACEdowntown

  STBSTR(,QiQ[,])
  c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓ(f)j的子字符Ԍ如果j为空Q则直到串的N?br />select SUBSTR('Message',1,4) from dualSUBSMess

  SUBSTRB(,QiQ[,])
  与SUBSTR大致相同Q只是I,J是以字节计算?/p>

  SOUNDEX()
  q回与c1发音怼的词
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250

  TRANSLATE(,,)
  c1中与c2相同的字W以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble

  TRIM([[]] from c3)
  c3串中的第一个,最后一个,或者都删除?br />select TRIM(' space padded ') trim from dual TRIMspace padded

  UPPER()
  q回c1的大写,常出现where子串?br />select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
单行数字函数

  单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作
数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>

  ABS()
  q回n的绝对?/p>

  ACOS()
  反余玄函敎ͼq回-1?之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0

  ASIN()
  反正玄函敎ͼq回-1?Qn表示弧度

  ATAN()
  反正切函敎ͼq回n的反正切|n表示弧度?/p>

  CEIL()
  q回大于或等于n的最整数?/p>

  COS()
  q回n的余玄|n为弧?/p>

  COSH()
  q回n的双曲余玄|n 为数字?br />select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847

  EXP()
  q回e的nơ幂Qe=2.71828183.

  FLOOR()
  q回于{于N的最大整数?/p>

  LN()
  q回N的自然对敎ͼN必须大于0

  LOG(,)
  q回以n1为底n2的对?/p>

  MOD()
  q回n1除以n2的余敎ͼ

  POWER(,)
  q回n1的n2ơ方

  ROUND(,)
  q回舍入数点右边n2位的n1的|n2的缺省gؓ(f)0Q这回将数Ҏ(gu)接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?br />select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54

  SIGN()
  如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0.

  SINQ?
  q回n的正玄?n为弧度?/p>

  SINH()
  q回n的双曲正玄?n为弧度?/p>

  SQRT()
  q回n的^Ҏ(gu),n为弧?/p>

  TANQ?
  q回n的正切?n为弧?/p>

  TANH()
  q回n的双曲正切?n为弧?/p>

  TRUNC(,)
  q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时?x)将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>

  单行日期函数

  单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>

  ADD_MONTHS(,QiQ?
  q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会(x)截去数点后面的部分?/p>

  LAST_DAY()
  函数q回包含日期d的月份的最后一?

  MONTHS_BETWEEN(,)
  q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则?x)返回的l果包含一个分数?/p>

  NEW_TIME(,,)
  d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>

  NEXT_DAY(,)
  q回日期d后由dowl出的条件的W一天,dow使用当前?x)话中给出的语言指定了一周中的某一天,q回的时间分量与d的时间分量相同?br />select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004

  ROUND([,])
  日期d按照fmt指定的格式舍入,fmt为字W串?/p>

  SYADATE
  函数没有参数Q返回当前日期和旉?/p>

  TRUNC([,])
  q回由fmt指定的单位的日期d.
单行转换函数

  单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>

  CHARTORWID()
  c 使一个字W串Q函数将c转换为RWID数据cd?br />SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')

  CONVERT(,[,])
  c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓ(f)dset字符集,sset的缺省设|ؓ(f)数据库的字符集?/p>

  HEXTORAW()
  x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>

  RAWTOHEX()
  x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ(f)16q制的数据类型?/p>

  ROWIDTOCHAR()
  函数ROWID数据cd转换为CHAR数据cd?/p>

  TO_CHAR([[,)
  x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及(qing)货币W号?br />NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"

  TO_DATE([,[,Q?br />  c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>

  TO_MULTI_BYTE()
  c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>

  TO_NUMBER([,[,)
  c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>

  TO_SINGLE_BYTE()
  字W串c中得多字节字W{化成{h(hun)的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>

  其它单行函数

  BFILENAME(
,)
  dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>

  DECODE(,,[,,,[])
  x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>

  DUMP(,[,[,[,]]])
  x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回?/p>

  EMPTY_BLOB()
  该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>

  EMPTY_CLOB()
  该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>

  GREATEST()
  exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>

  LEAST()
  exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>

  UID
  该函数没有参敎ͼq回唯一标示当前数据库用L(fng)整数?/p>

  USER
  q回当前用户的用户名

  USERENV()
  Zoptq回包含当前?x)话信息。opt的可选gؓ(f)Q?/p>

  ISDBA    ?x)话中SYSDBA脚色响应Q返回TRUE
  SESSIONID  q回审计?x)话标示W?/p>

 ENTRYID   q回可用的审计项标示W?
  INSTANCE  在会(x)话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?br />  LANGUAGE  q回语言、地域、数据库讄的字W集?br />  LANG    q回语言名称的ISO~写?br />  TERMINAL  为当前会(x)话用的l端或计机q回操作pȝ的标C符?/p>

  VSIZE()
  x是一个表辑ּ。返回x内部表示的字节数?br />SQL中的l函?/p>

  l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.

  l(多行Q函?/p>

  与单行函数相比,oracle提供了丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>

  AVG([{DISYINCT|ALL}])
  q回数值的q_倹{缺省设|ؓ(f)ALL.
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413

  COUNT({*|DISTINCT|ALL} )
  q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>

  MAX([{DISTINCT|ALL}])
  q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>

  MIN([{DISTINCT|ALL}])
  q回选择列表目的最倹{?/p>

  STDDEV([{DISTINCT|ALL}])
  q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>

  SUM([{DISTINCT|ALL}])
  q回选择列表目的数值的d?/p>

  VARIANCE([{DISTINCT|ALL}])
  q回选择列表目的统计方差?/p>

  用GROUP BYl数据分l?/p>

  正如题目暗示的那L(fng)函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ(f)分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ(f)一cR?br />select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982

  在这个例子中Q我们用state字段分类Q如果我们要结果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?br />select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982

  用HAVING子句限制分组数据

  现在你已l知道了在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:(x)
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

  q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ(gu)是用HAVING语句Q?br />SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;

  嵌套函数

  函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?/p>


 



Lib 2007-01-22 16:45 发表评论
]]>
վ֩ģ壺 ľ| ԭ| | Ϋ| | | | ī| | ̫| | ˮ| ʯ¥| Ϻ| ƽ| Ϫ| ƽ| | Դ| ƽ| ͨ| | ϼ| | ɽ| | Ρɽ| | Ҵ| | | ǭ| | Т| ͼ| °Ͷ| | | ϴ| | |