??xml version="1.0" encoding="utf-8" standalone="yes"?>91ph在线,久久精品一区中文字幕,欧美色视频免费http://www.aygfsteel.com/wujian929/专业是一U精!zh-cnSat, 17 May 2025 20:24:09 GMTSat, 17 May 2025 20:24:09 GMT60点击大标题显CZ隐藏标?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/10/25/77243.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Wed, 25 Oct 2006 09:37:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/10/25/77243.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/77243.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/10/25/77243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/77243.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/77243.html</trackback:ping><description><![CDATA[ <font color="#ff1493"><SCRIPT language=javascript1.2><br />function showsubmenu(sid)<br />{<br />whichEl = eval("submenu" + sid);<br />if (whichEl.style.display == "none")<br />{<br />eval("submenu" + sid + ".style.display=\"\";");<br />}<br />else<br />{<br />eval("submenu" + sid + ".style.display=\"none\";");<br />}<br />}<br /></SCRIPT><br /></font> <br /> <br /> <font color="#7fffd4"> <font color="#0000ff">用法Q?/font> <br /> </font> <br /><tr><br />            <td height="26" background="../image/menu.gif" id="menuTitle1" onClick="showsubmenu(1)" style="cursor:hand;">&nbsp;&nbsp;&nbsp;<br />            <font color="#FF9900">?amp;nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FFFFFF"><strong>知识库分c?lt;/strong></font><br />            </td><br />          </tr><br />          <tr><br /><td style="display:none" id='submenu1'><br />     <table cellspacing="0" align="center" width="100%"><br />                <tr><br />                  <td class="nav">· <a href="<%=request.getContextPath()%>/knowledge/knowledgeCategoryList.htm?order=list" target="mainFrame">~辑知识库分c?lt;/a></td><br />                </tr><br />                <tr><br />                  <td class="nav">· <a href="<%=request.getContextPath()%>/knowledge/knowledgeCategoryList.htm?order=edit" target="mainFrame">新增知识库分c?lt;/a></td><br />                </tr><br />              </table><img src ="http://www.aygfsteel.com/wujian929/aggbug/77243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-10-25 17:37 <a href="http://www.aygfsteel.com/wujian929/archive/2006/10/25/77243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>列表中的删除链接http://www.aygfsteel.com/wujian929/archive/2006/10/25/77228.htmllovetqlovetqWed, 25 Oct 2006 08:32:00 GMThttp://www.aygfsteel.com/wujian929/archive/2006/10/25/77228.htmlhttp://www.aygfsteel.com/wujian929/comments/77228.htmlhttp://www.aygfsteel.com/wujian929/archive/2006/10/25/77228.html#Feedback0http://www.aygfsteel.com/wujian929/comments/commentRss/77228.htmlhttp://www.aygfsteel.com/wujian929/services/trackbacks/77228.html在很多的列表中,后面的操作一栏会(x)有删除链接,q且?x)让你确认。此处的代码Q?/font> 
<a href='javascript:deleteCategory("<%=article.getId() %>")'>删除</a>
     

javascript函数
<script>
 function deleteCategory(articleId)
 {
  if(confirm('是否真的要删除该记录'))
   window.location='<%=request.getContextPath()%>/info/infoArticleEdit.htm?order=delete&articleId='+articleId;
 }
</script>

一些链接:(x)
<input class="button3" type=button value="q回" onclick="javascript:window.location='<%=request.getContextPath() %>/info/infoArticleList.htm'">

<td>文g名:(x)<a href='<%=request.getContextPath()%>/info/infoArticleEdit.htm?order=download&fileId=<%=accessory.getId() %>'><%=accessory.getFileExt() %></a>
     
<c:url value="........" />
  
一些传?br />
<input type=hidden name=order value=save>
<input type=hidden name=id value="<c:out value="${infoArticle.id}" />">
<input type=hidden name=navId value="<%=request.getParameter("navId") %>">
<input type=hidden name=fileCount value=1>


lovetq 2006-10-25 16:32 发表评论
]]>
多选框的操作及(qing)传?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/10/25/77121.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Wed, 25 Oct 2006 01:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/10/25/77121.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/77121.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/10/25/77121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/77121.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/77121.html</trackback:ping><description><![CDATA[ <p> <strong> <font color="#800080"> <font color="#ff1493">面代码Q?/font> <br /> </font> </strong><!--  q个是显C的多选框面 已有的角色要打勾Q可以重新选择角色--><br /><form action="<c:url value="/sys/userRolesEdit.htm"/>" method="post" ></p> <p>      <table class="grid" width="100%" cellspacing="1"><br />      <br />    <tr><br />       <td colspan="6" class="title"><br />          角色列表<br />       </td><br />    </tr><br />    <tr><br />      <td class="column"></td><br />       <td class="column">角色ID</td><br />       <td class="column">角色?lt;/td><br />       <td class="column">角色代码</td><br />       <td class="column">角色描述</td>       </p> <p>    </tr></p> <p>    <font color="#ff1493"><!-- 循环昄列表userRoles的每一,q判断如果数据库中已有的打勾<c:if test标签正确才执行中间的代码--><br /></font>    <c:forEach items="${roles}" var="item">    <br />   <tr>      <br />     <td><br />     <input type="checkbox" name="rolesId" <c:forEach items="${userRoles}" var = "selectedRoles"><br />     <c:if test="${item.srolId == selectedRoles.srolId}">checked="true"</c:if></c:forEach><br />      value="<c:out value="${item.srolId}"/>" /><br />     </td><br />   <br />     <td><c:out value="${item.srolId}"/></td><br />        <td><c:out value="${item.srolName}"/> </td><br />                 <td><c:out value="${item.srolCode}"/></td><br />                 <td><c:out value="${item.srolDesc}"/></td>                 <br />     <tr>       <br />    </c:forEach>    <br />    <br />    <tr></p> <p>       <td colspan="6" class="nav">&nbsp;<br />           <input type="hidden" name="userID"<br />   value=<c:out value="${userInfo.suinId}"/>><br />      <input type="submit" class="button3" value="提交"/><br />      <INPUT type="button" class="button2" value="q回" onclick="history.back()" /><br />      <br />       </td><br />    </tr><br />   </table> <br />   </form><br /><br /><strong><font color="#ff1493">控制器代码:(x)<br /></font></strong>protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {<br />  // TODO Auto-generated method stub<br />  <br />  Map result = new HashMap();<br />   <br />  SysUserinfo userInfo = null;<br />        String id = request.getParameter("userID");</p> <p>        System.out.println(id);<br />        if (id != null && !id.equals(""))<br />        {<br />            userInfo = (SysUserinfo) sysService.get(SysUserinfo.class,<br />                    new Long(id));<br />            <br />        } <br />        else<br />        {<br />            <br />        }<br />        <br />        result.put("userInfo", userInfo);<br />        result.put("roles", sysService.getSupportData("SysRole", null));<br />        if (userInfo != null)<br />        {<br />         result.put("userRoles", sysService.getUserRoles(userInfo));<br />        }<br />        <br />  <br />        <br />        SysUserRole sysUserRole = null;<br />        SysRole sysRole = null;<br />        String roleId = null;<br />        <br />        // 记录父列表ID<br />        result.put("parentlistID", request.getParameter("parentlistID"));<br />        result.put("userInfo", userInfo);<br />        <br />         <font color="#ff1493">//遍历所有map里的key</font><br />        Iterator it = result.keySet().iterator();<br />        while (it.hasNext())<br />        {<br />            String key = (String) it.next();<br />            request.setAttribute(key, result.get(key));<br />        }<br />        <br />        <font color="#ff1493"> //q里是从列表多选框传过来的数倹{根据name属性获得所有的value</font><br />        String[] rolesId = null;<br />        rolesId = request.getParameterValues("rolesId");<br />        System.out.println("------------------------" + rolesId + "-------------------");<br />        <br />        if (rolesId == null || rolesId.equals(null))<br />        {<br />         return new ModelAndView(formView);<br />        }<br />        <br />        else<br />        {      <br />         List userRoles = (List)sysService<br />          .getUsersUserRoles(userInfo.getSuinId());</p> <p> <br />      <font color="#ff1493">//先删除数据库中所有的Q再插入所选的?br /></font>         for (int k = 0; k < userRoles.size(); k++)<br />      {<br />       SysUserRole userRole = (SysUserRole)userRoles.get(k);      <br />       sysService.delete(userRole);<br />       <br />      }<br />         <br />         for (int i = 0; i < rolesId.length; i++)<br />         {<br />          roleId = rolesId[i];<br />          <br />          sysRole = (SysRole)sysService.get(SysRole.class, new Long(roleId));<br />          sysUserRole = new SysUserRole();<br />          sysUserRole.setUser(userInfo);<br />          sysUserRole.setRole(sysRole);<br />          sysService.save(sysUserRole);        <br />         }<br /><br />         <font color="#ff1493">//如果?##-servlet.xml配置文g中,successView不能传递参敎ͼ可在q里直接有response导向别的面</font><br />         response.sendRedirect(request.getContextPath() <br />           + "/sys/userRolesList.htm?userID=" + userInfo.getSuinId().toString());<br />         return null;<br />        }</p> <p> }<br /><br /><br /></p> <img src ="http://www.aygfsteel.com/wujian929/aggbug/77121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-10-25 09:27 <a href="http://www.aygfsteel.com/wujian929/archive/2006/10/25/77121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizerQ字W串分隔解析cdQ{Q?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/10/08/73872.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Sun, 08 Oct 2006 09:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/10/08/73872.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/73872.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/10/08/73872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/73872.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/73872.html</trackback:ping><description><![CDATA[ <strong>StringTokenizerQ字W串分隔解析cd<br /></strong> <span style="COLOR: indigo">属于Qjava.util包?/span> <br /> <br /> <span style="COLOR: blue">Q、构造函数?/span> <br /> <ul> <br />1. <span style="COLOR: green">StringTokenizer(String str)</span> Q构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t?”、“换行符(‘\n?”、“回车符(‘\r?”?br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W?br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W,同时Q指定是否返回分隔符?/ul> <br /> <br /> <span style="COLOR: blue">Q、方法?/span> <br /> <span style="COLOR: red">说明Q?br />1. 所有方法均为publicQ?br />2. 书写格式QE修饰W] <q回cd> <Ҏ(gu)名(Qd数列表]Q?gt;</span> <span style="COLOR: olive"> <br />如:(x)<br />static int parseInt(String s) 表示Q此Ҏ(gu)QparseIntQؓ(f)cL法(staticQ,q回cd为(intQ,Ҏ(gu)所需参数为Stringcd?/span> <br /> <br /> <ul>1. <span style="COLOR: green">int countTokens() </span>Q返回nextTokenҎ(gu)被调用的ơ数。如果采用构造函??Q返回的是分隔W数??)?br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>Q返回是否还有分隔符?br />3. <span style="COLOR: green">boolean hasMoreElements() </span>Q结果同2?br />4. <span style="COLOR: green">String nextToken()</span> Q返回从当前位置C一个分隔符的字W串?br />5. <span style="COLOR: green">Object nextElement() </span>Q结果同4?br />6. <span style="COLOR: green">String nextToken(String delim)</span> Q与4cMQ以指定的分隔符q回l果?/ul> <br /> <br /> <span style="COLOR: olive">例子Q?/span> <br /> <pre> String s = new String("The Java platform is the ideal platform for network computing");<br /> StringTokenizer st = new StringTokenizer(s);<br /> System.out.println( "Token Total: " + st.countTokens() );<br /> while( st.hasMoreElements() ){<br /> System.out.println( st.nextToken() );<br />           }<br />l果为:(x)<br />Token Total: 10<br />The<br />Java<br />platform<br />is<br />the<br />ideal<br />platform<br />for<br />network<br />computing<br /></pre> <br /> <span style="COLOR: olive">?:</span> <br /> <pre> String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");<br /> StringTokenizer st = new StringTokenizer(s,"=",true);<br /> System.out.println( "Token Total: " + st.countTokens() );<br /> while( st.hasMoreElements() ){<br /> System.out.println( st.nextToken() );<br /> }<br />l果为:(x)<br />Token Total: 19<br />The<br />=<br />Java<br />=<br />platform<br />=<br />is<br />=<br />the<br />=<br />ideal<br />=<br />platform<br />=<br />for<br />=<br />network<br />=<br />computing<br /></pre> <img src ="http://www.aygfsteel.com/wujian929/aggbug/73872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-10-08 17:33 <a href="http://www.aygfsteel.com/wujian929/archive/2006/10/08/73872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsphttp://www.aygfsteel.com/wujian929/archive/2006/09/21/71074.htmllovetqlovetqThu, 21 Sep 2006 05:46:00 GMThttp://www.aygfsteel.com/wujian929/archive/2006/09/21/71074.htmlhttp://www.aygfsteel.com/wujian929/comments/71074.htmlhttp://www.aygfsteel.com/wujian929/archive/2006/09/21/71074.html#Feedback0http://www.aygfsteel.com/wujian929/comments/commentRss/71074.htmlhttp://www.aygfsteel.com/wujian929/services/trackbacks/71074.html JSP语法Q?Q——jsp:getProperty

<jsp:getProperty>

获取Bean的属性|用于昄在页面中

JSP 语法

<jsp:getProperty name="beanInstanceName" property="propertyName" />

例子

<jsp:useBean id="calendar" scope="page" class="employee.Calendar" />

<h2>

Calendar of <jsp:getProperty name="calendar" property="username" />

</h2>

描述

q个<jsp:getProperty>元素获得Bean的属性|q可以将其用或昄在JSP面?在你使用<jsp:getProperty>之前Q你必须?lt;jsp:useBean>创徏?

<jsp:getProperty>元素有一些限?

你不能?lt;jsp:getProperty>来检索一个已l被索引了的属?br />
你能够和JavaBeanslg一起?lt;jsp:getProperty>,但是不能与Enterprise

Bean一起用?br />
属?br />
name="beanInstanceName"
bean的名??lt;jsp:useBean>指定

property="propertyName"
所指定的Bean的属性名?br />
技?

在sun的JSP参考中提到Q如果你使用<jsp:getProperty>来检索的值是I|那么NullPointerException会(x)出现Q同时如果用程序段或表辑ּ来检索其|那么在浏览器上出现的是nullQ空).


jsp:getProperty Action

语法Q?

  <jsp:getProperty name="beanInstanceName" property="propertyName" />

  q个属性检索出bean的属性的值ƈ之转化Z个字W串Q然后将之插入到输出。它有两个必选属性:(x)nameQ在之前用jsp:useBean引入的名UͼpropertyQ必被插入值的属性?/p>



lovetq 2006-09-21 13:46 发表评论
]]>
Calendar的用?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/09/21/71048.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Thu, 21 Sep 2006 03:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/09/21/71048.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/71048.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/09/21/71048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/71048.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/71048.html</trackback:ping><description><![CDATA[ <p>java.util.*;<br /><br />public class ShowDate {<br /><br />public static void main(String[] args) {<br />Calendar calendar = new GregorianCalendar();<br />Date trialTime = new Date();<br />calendar.setTime(trialTime);<br /><br />// print out a bunch of interesting things<br />System.out.println("ERA: " + calendar.get(Calendar.ERA));<br />System.out.println("YEAR: " + calendar.get(Calendar.YEAR));<br />System.out.println("MONTH: " + calendar.get(Calendar.MONTH));<br />System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));<br />System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));<br />System.out.println("DATE: " + calendar.get(Calendar.DATE));<br />System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));<br />System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));<br />System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));<br />System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));<br />System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));<br />System.out.println("HOUR: " + calendar.get(Calendar.HOUR));<br />System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));<br />System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));<br />System.out.println("SECOND: " + calendar.get(Calendar.SECOND));<br />System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));<br />System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000)));<br />System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000)));<br /><br />System.out.println("Current Time, with hour reset to 3");<br />calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override<br />calendar.set(Calendar.HOUR, 3);<br />System.out.println("ERA: " + calendar.get(Calendar.ERA));<br />System.out.println("YEAR: " + calendar.get(Calendar.YEAR));<br />System.out.println("MONTH: " + calendar.get(Calendar.MONTH));<br />System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));<br />System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));<br />System.out.println("DATE: " + calendar.get(Calendar.DATE));<br />System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));<br />System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));<br />System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));<br />System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));<br />System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));<br />System.out.println("HOUR: " + calendar.get(Calendar.HOUR));<br />System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));<br />System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));<br />System.out.println("SECOND: " + calendar.get(Calendar.SECOND));<br />System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));<br />System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // in hours<br />System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000))); // in hours <br />}<br /><br />}<br /><br /><br />import java.text.DateFormat;<br />import java.util.*;</p> <p>public class JspCalendar {<br />    Calendar  calendar = null;</p> <p>    public JspCalendar() {<br /> calendar = Calendar.getInstance();<br /> Date trialTime = new Date();<br /> calendar.setTime(trialTime);<br />    }</p> <p>    public int getYear() {<br /> return calendar.get(Calendar.YEAR);<br />    }<br />    <br />    public String getMonth() {<br /> int m = getMonthInt();<br /> String[] months = new String [] { "January", "February", "March",<br />     "April", "May", "June",<br />     "July", "August", "September",<br />     "October", "November", "December" };<br /> if (m > 12)<br />     return "Unknown to Man";<br /> <br /> return months[m - 1];</p> <p>    }</p> <p>    public String getDay() {<br /> int x = getDayOfWeek();<br /> String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", <br />          "Thursday", "Friday", "Saturday"};</p> <p> if (x > 7)<br />     return "Unknown to Man";</p> <p> return days[x - 1];</p> <p>    }<br />    <br />    public int getMonthInt() {<br /> return 1 + calendar.get(Calendar.MONTH);<br />    }</p> <p>    public String getDate() {<br /> return getMonthInt() + "/" + getDayOfMonth() + "/" +  getYear();</p> <p>    }</p> <p>    public String getTime() {<br /> return getHour() + ":" + getMinute() + ":" + getSecond();<br />    }</p> <p>    public int getDayOfMonth() {<br /> return calendar.get(Calendar.DAY_OF_MONTH);<br />    }</p> <p>    public int getDayOfYear() {<br /> return calendar.get(Calendar.DAY_OF_YEAR);<br />    }</p> <p>    public int getWeekOfYear() {<br /> return calendar.get(Calendar.WEEK_OF_YEAR);<br />    }</p> <p>    public int getWeekOfMonth() {<br /> return calendar.get(Calendar.WEEK_OF_MONTH);<br />    }</p> <p>    public int getDayOfWeek() {<br /> return calendar.get(Calendar.DAY_OF_WEEK);<br />    }<br />     <br />    public int getHour() {<br /> return calendar.get(Calendar.HOUR_OF_DAY);<br />    }<br />    <br />    public int getMinute() {<br /> return calendar.get(Calendar.MINUTE);<br />    }</p> <p> <br />    public int getSecond() {<br /> return calendar.get(Calendar.SECOND);<br />    }</p> <p>    public static void main(String args[]) {<br /> JspCalendar db = new JspCalendar();<br /> p("date: " + db.getDayOfMonth());<br /> p("year: " + db.getYear());<br /> p("month: " + db.getMonth());<br /> p("time: " + db.getTime());<br /> p("date: " + db.getDate());<br /> p("Day: " + db.getDay());<br /> p("DayOfYear: " + db.getDayOfYear());<br /> p("WeekOfYear: " + db.getWeekOfYear());<br /> p("era: " + db.getEra());<br /> p("ampm: " + db.getAMPM());<br /> p("DST: " + db.getDSTOffset());<br /> p("ZONE Offset: " + db.getZoneOffset());<br /> p("TIMEZONE: " + db.getUSTimeZone());<br />    }</p> <p>    private static void p(String x) {<br /> System.out.println(x);<br />    }</p> <p> <br />    public int getEra() {<br /> return calendar.get(Calendar.ERA);<br />    }</p> <p>    public String getUSTimeZone() {<br /> String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific",<br />           "Mountain", "Central", "Eastern"};<br /> <br /> return zones[10 + getZoneOffset()];<br />    }</p> <p>    public int getZoneOffset() {<br /> return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000);<br />    }</p> <p> <br />    public int getDSTOffset() {<br /> return calendar.get(Calendar.DST_OFFSET)/(60*60*1000);<br />    }</p> <p>    <br />    public int getAMPM() {<br /> return calendar.get(Calendar.AM_PM);<br />    }<br />}<br /></p> <img src ="http://www.aygfsteel.com/wujian929/aggbug/71048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-09-21 11:45 <a href="http://www.aygfsteel.com/wujian929/archive/2006/09/21/71048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp:setProperty的用(转别人的Q?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/09/21/71044.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Thu, 21 Sep 2006 03:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/09/21/71044.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/71044.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/09/21/71044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/71044.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/71044.html</trackback:ping><description><![CDATA[ <span id="ArticleContent1_ArticleContent1_lblContent"><jsp:useBean id=“calculator?scope=“request?class=“com.jspdev.SimpleCalculator?gt;<br /><jsp:setProperty name=“calculator?property=??><br /></jsp:useBean><br /><br />(1)property=??br />讄Bean 属性的快捷方式Q在Bean 中属性的名字Q类型必drequest对象中的参数名称相匹配。由于表单中传过来的数据cd都是String cd的,Jsp内在机制?x)把q些参数转化成Bean属性对应的cd?br />(2)property=“propertyName?br />使用request对象中的一个参数值来指定Bean中的一个属性倹{在q个语法中,property指定Bean 的属性名Q而且Bean 属性和request参数的名字应相同。也是_(d)如果在Bean 中有setUserName(String userName)Ҏ(gu)Q那么,propertyName的值就是“userName?br /><br /><jsp:setProperty name="Name" property="*" /><br />Ҏ(gu)已提交表单中的数据,讄q个javaBean中相应的属性倹{?br />*:JavaBean属性的名称和表单对象的名称相同时才能够赋?br /><jsp:setProperty name="Name" property="propertyName" value="PropertyValue" | param="ParameterName" /><br />把JavaBean指定的属性设为指定的?br /><br />jsp:setProperty用来讄Bean的属性倹{?br />有两U方法?br />1。在jsp:useBean之后2。在jsp:useBean实体q中间有区别的第一U情况jsp:setProperty<br />不管是新生成的实例还是原来的对象Q都?x)进?br />2。只有在新生成的情况下才可以执行<br /><jsp:setProperty>中的name 应该和jsp:useBean中的id一L(fng)<br />property="*" 表示用用戯入的所有值来匚wBean中的属性,当然你也可以指定?br /><br /></span> <img src ="http://www.aygfsteel.com/wujian929/aggbug/71044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-09-21 11:34 <a href="http://www.aygfsteel.com/wujian929/archive/2006/09/21/71044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转蝲好文章(springQ?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/09/07/68281.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Thu, 07 Sep 2006 06:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/09/07/68281.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/68281.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/09/07/68281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/68281.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/68281.html</trackback:ping><description><![CDATA[ <script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]></script>   <div id="wmqeeuq" class="post" id="article"><div id="wmqeeuq" class="postTitle"><a ><img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> 理解spring</a>(转的别h的)</div><div id="wmqeeuq" class="postText"><br /><br />最q研ISpringQ她包含的编E思想让我耳目一新。所以写下这入门文章供新手参考。我不是什么Spring的资qIh员,我只是现学现卖。所以文章也只能是肤单薄,错误隑օQ还误谅?br />一、    Spring诞生<br />Spring是一个开源框Ӟ目前在开源社区的人气很旺Q被认ؓ(f)是最有前途的开源框架之一。她是由Rod Johnson创徏的,她的诞生是ؓ(f)了简化企业pȝ的开发。说道Spring׃得不说EJBQ因为Spring在某U意义上是EJB的替代品Q她是一U轻量的容器。用qEJB的h都知道EJB很复杂,Z一个简单的功能你不得不~写多个Java文g和部|文Ӟ他是一U重量的容器。也怽不了解EJBQ你可能对“轻Q重Q量U”和“容器”比较陌生,那么q里我简单介l一下?br />1、什么是容器<br />“容器”,q个概念困扰我好久。从学习(fn)Tomcat开始就一直对此感到困惑。感性的来讲Q容器就是可以用来装东西的物品。那么在~程领域是指用来装对象QOO的思想Q如果你qOO都不了解Q徏议你d?fn)OO先)的对象。然而这个对象比较特别,它不仅要容纳其他对象Q还要维护各个对象之间的关系。这么讲可能q是太抽象,来看一个简单的例子Q?br />代码片断1Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> <font color="#ff0000">Container</font>  </li><li>{ </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> init() </li><li>    { </li><li>    Speaker s = <strong><font color="#0000ff">new</font></strong> Speaker(); </li><li>    Greeting g = <strong><font color="#0000ff">new</font></strong> Greeting(s); </li><li>    } </li><li>} </li></ol></div><br />可以看到q里的Containerc(容器Q在初始化的时候会(x)生成一个Speaker对象和一个Greeting对象Qƈ且维持了它们的关p,当系l要用这些对象的时候,直接问容器要可以了。这是容器最基本的功能,l护pȝ中的实例Q对象)。如果到q里你还是感到模p的话,别担心,我后面还?x)有相关的解释?br /><br />2、轻量与重量<br />所谓“重量”是相对于“轻量”来讲的Q也可以说“轻量”是相对于重量来讲的。在Spring出现之前Q企业开发一般都采用EJBQ因为它提供的事务管理,声明式事务支持,持久化,分布计算{等都“简化”了企业U应用的开发。我q里的“简化”打了双引号Q因是相对的。重量容器是一U入侵式的,也就是说你要用EJB提供的功能就必须在你的代码中体现出来你用的是EJBQ比如承一个接口,声明一个成员变量。这样就把你的代码绑定在EJB技术上了,而且EJB需要JBOSSq样的容器支持,所以称之ؓ(f)“重量”?br />相对而言“轻量”就是非入R式的Q用Spring开发的pȝ中的cM需要依赖Spring中的c,不需要容器支持(当然Spring本n是一个容器)Q而且Spring的大和q行开支都很微量。一般来_(d)如果pȝ不需要分布计或者声明式事务支持那么Spring是一个更好的选择?br /><br />二、    几个核心概?br />在我看来Spring的核心就是两个概念,反向控制QIoCQ,面向切面~程QAOPQ。还有一个相关的概念是POJOQ我也会(x)略带介绍?br />1、POJO<br />我所看到q的POJO全称有两个,Plain Ordinary Java ObjectQPlain Old Java ObjectQ两个差不多Q意思都是普通的Javac,所以也不用ȝ谁对谁错。POJO可以看做是简单的JavaBeanQ具有一pdGetterQSetterҎ(gu)的类Q。严格区分这里面的概忉|有太大意义,了解一下就行?br />2、    IoC<br />IoC的全U是Inversion of ControlQ中文翻译反向控制或者逆向控制。这里的反向是相对EJB来讲的。EJB使用JNDI来查N要的对象Q是d的,而Spring是把依赖的对象注入给相应的类Q这里涉?qing)到另外一个概念“依赖注入”,E后解释Q,是被动的Q所以称之ؓ(f)“反向”。先看一D代码,q里的区别就很容易理解了?br />代码片段2Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>{ </li><li>Speaker s = <strong><font color="#0000ff">new</font></strong> Speaker(); </li><li>s.sayHello(); </li><li>} </li></ol></div><br />代码片段3Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>{ </li><li>Speaker s = (Speaker)context.lookup(<font color="#ff33ff">"ejb/Speaker"</font>); </li><li>s.sayHello(); </li><li>} </li></ol></div><br />代码片段4Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> Greeting  </li><li>{ </li><li>    <strong><font color="#0000ff">public</font></strong> Speaker s; </li><li>    <strong><font color="#0000ff">public</font></strong> Greeting(Speaker s) </li><li>    { </li><li>        <strong><font color="#0000ff">this</font></strong>.s = s; </li><li>    } </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>    { </li><li>        s.sayHello(); </li><li>    } </li><li>} </li></ol></div><br />我们可以Ҏ(gu)一下这三段代码。其中片D?是不用容器的~码Q片D?是EJB~码Q片D?是Spring~码。结合代码片D?Q你能看出来Spring~码的优之处吗Q也怽?x)觉得Spring的编码是最复杂的。不q没关系Q我在后面会(x)解释Spring~码的好处?br />q里我想先解释一下“依赖注入”。根据我l的例子可以看出QGreetingcM赖SpeakercR片D?和片D?都是d的去获取SpeakerQ虽然获取的方式不同。但是片D?q没有去获取或者实例化Speakerc,而是在greeting函数中直接用了s。你也许很容易就发现了,在构造函C有一个s被注入(可能你^时用的是Q传入)。在哪里注入的呢Q请回头看一下代码片D?Q这是使用容器的好处,由容器来l护各个cM间的依赖关系Q一般通过Setter来注入依赖,而不是构造函敎ͼ我这里是Z化示例代码)。Greetingq不需要关心Speaker是哪里来的或是从哪里获得SpeakerQ只需要关注自己分内的事情Q也是让Speaker说一句问候的话?br />3、    AOP<br />AOP全称是Aspect-Oriented ProgrammingQ中文翻译是面向斚w的编E或者面向切面的~程。你应该熟?zhn)面向q程的编E,面向对象的编E,但是面向切面的编E你也许是第一ơ听说。其实这些概念听h很玄Q说到底也就是一句话的事情?br />现在的系l往往减小模块之间的耦合度,AOP技术就是用来帮助实现这一目标的。D例来_(d)假如上文的Greetingpȝ含有日志模块Q安全模块,事务理模块Q那么每一ơgreet的时候,都会(x)有这三个模块参与Q以日志模块ZQ每ơgreet之后Q都要记录下greet的内宏V而对于Speaker或者Greeting对象来说Q它们ƈ不知道自q行ؓ(f)被记录下来了Q它们还是像以前一L(fng)工作Qƈ没有M区别。只是容器控制了日志行ؓ(f)。如果这里你有点p涂Q没关系Q等讲到具体Spring配置和实现的时候你明白了?br />假如我们现在为Greetingpȝ加入一个Valediction功能Q那么AOP模式的系l结构如下:(x)<br />G|RET|TIN|G<br />V|ALE|DIT|ION<br />|   |   |<br />日志 安全 事务<br /><br />q些模块是诏I在整个pȝ中的Qؓ(f)pȝ的不同的功能提供服务Q可以称每个模块是一个“切面”。其实“切面”是一U抽象,把系l不同部分的公共行ؓ(f)抽取出来形成一个独立的模块Qƈ且在适当的地方(也就是切入点Q后文会(x)解释Q把q些被抽取出来的功能再插入系l的不同部分?br />从某U角度上来讲“切面”是一个非常Ş象的描述Q它好像在系l的功能之上横切一刀Q要惌pȝ的功能l,必dq了q个切面。这些切面监视ƈ拦截pȝ的行为,在某些(被指定的Q行为执行之前或之后执行一些附加的dQ比如记录日志)。而系l的功能程Q比如GreetingQƈ不知道这些切面的存在Q更不依赖于q些切面Q这样就降低了系l模块之间的耦合度?br /><br />三、    Spring初体?br />q一节我用一个具体的例子GreetingQ来说明使用Spring开发的一般流E和Ҏ(gu)Q以?qing)Spring配置文g的写法?br />首先创徏一个Speakerc,你可以把q个cȝ做是POJO?br />代码片段5Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> Speaker  </li><li>{ </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> sayHello() </li><li>    { </li><li>        <strong><a target="_blank"><font class="classLink"><u>System</u></font></a></strong>.out.println(<font color="#ff33ff">"Hello!"</font>); </li><li>    } </li><li>} </li></ol></div>再创Z个GreetingcR?br />代码片段6Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> Greeting  </li><li>{ </li><li>    <strong><font color="#0000ff">private</font></strong> Speaker speaker; </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> setSpeaker(Speaker speaker) </li><li>    { </li><li>        <strong><font color="#0000ff">this</font></strong>.speaker = speaker; </li><li>    } </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>    { </li><li>        speaker.sayHello(); </li><li>    } </li><li>} </li></ol></div><br />然后要创Z个Spring的配|文件把q两个类兌h?br />代码片段7QapplicationContext.xmlQ:(x)<br /><div id="wmqeeuq" class="codeStyle"><ol><li><?xml version=<font color="#ff33ff">"1.0"</font> encoding=<font color="#ff33ff">"UTF-8"</font>?> </li><li><!DOCTYPE beans PUBLIC <font color="#ff33ff">"-//SPRING//DTD BEAN//EN"</font>  </li><li>    <font color="#ff33ff">"http://www.springframework.org/dtd/spring-beans.dtd"</font>> </li><li></li><li><beans> </li><li>    <bean id=<font color="#ff33ff">"Speaker"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Speaker"</font>></bean> </li><li>    <bean id=<font color="#ff33ff">"Greeting"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Greeting"</font>> </li><li>        <property name=<font color="#ff33ff">"speaker"</font>> </li><li>            <ref bean=<font color="#ff33ff">"Speaker"</font>/> </li><li>        </property> </li><li>    </bean> </li><li></beans> </li></ol></div><br />要用Spring Framework必须把Spring的包加入到Classpath中,我用的是Eclipse+MyEclipseQ这些工作是自动完成的。推荐用Spring的配|文件编辑器来编辑,U手工编写很Ҏ(gu)出错。我先分析一下这个xml文g的结构,然后再做试。从<beans>节点开始,先声明了两个<bean>Q第二个bean有一个speaker属性(propertyQ要求被注入Q注入的内容是另外一个bean Speaker。这里的命名是符合JavaBean规范的,也就是说如果是speaker属性,那么Spring容器׃(x)调用setSpeaker()来注入这个属性?lt;ref>是reference的意思,表示引用另外一个bean?br />下面看一D늮单的试代码Q?br />代码片段8Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">static</font></strong> <strong><font color="#0000ff">void</font></strong> main(<strong><a target="_blank"><font class="classLink"><u>String</u></font></a></strong>[] args)  </li><li>{ </li><li>        ApplicationContext context =  </li><li>            New ClassPathXmlApplicationContext(<font color="#ff33ff">"applicationContext.xml"</font>); </li><li>        Greeting greeting = (Greeting)context.getBean(<font color="#ff33ff">"Greeting"</font>); </li><li>        greeting.greet(); </li><li>} </li></ol></div><br />q段代码很简单,如果你上文都看懂了,那么q里应该没有问题。值得注意的是Spring有两U方式来创徏容器Q我们不再用上文我们自己~写的ContainerQ,一U是ApplicationContextQ另外一U是BeanFactory。ApplicationContext更强大一些,而且使用上两者没有太大区别,所以一般说来都用ApplicationContext。Spring容器帮助我们l护我们在配|文件中声明的Bean以及(qing)它们之间的依赖关p,我们的Bean只需要关注自q核心业务?br /><br />四、    面向接口的~程<br />看了q么多,也许你ƈ没有觉得Springl开发带来了很多便利。那是因为我丄例子q不能突出Spring的优之处,接下来我通过接口~程来体现Spring的强大?br />假如现在要求扩展Greeting的功能,要让Speaker用不同的语言来问候,也就是说有不同的SpeakerQ比如ChineseSpeaker, EnglishSpeaker。那么对上文提到的三U编码方式(代码片段2??Q分别加以修改,你会(x)发现很麻烦。假如下ơ又要加入一个西班牙语,又得重复力_。很自然的会(x)考虑C用一个ISpeaker接口来简化工?Q更改后的代码如下(q里没有列出接口的相关代码,我想你应该明白怎么写)Q        ?br /><br />代码片段9Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>{ </li><li>ISpeaker s = <strong><font color="#0000ff">new</font></strong> ChineseSpeaker(); </li><li>s.sayHello(); </li><li>} </li></ol></div><br />代码片段10Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>{ </li><li>ISpeaker s = (ISpeaker)context.lookup(<font color="#ff33ff">"ejb/ChineseSpeaker"</font>); </li><li>s.sayHello(); </li><li>} </li></ol></div><br />代码片段11Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> Greeting  </li><li>{ </li><li>    <strong><font color="#0000ff">public</font></strong> ISpeaker s; </li><li>    <strong><font color="#0000ff">public</font></strong> Greet(ISpeaker s) </li><li>    { </li><li>        <strong><font color="#0000ff">this</font></strong>.s = s; </li><li>    } </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> greet() </li><li>    { </li><li>        s.sayHello(); </li><li>    } </li><li>} </li></ol></div>Ҏ(gu)三段代码Q你?x)发玎ͼW一U方法还是把具体的Speaker编码到代码中了Q第二中Ҏ(gu)E微好一点,但是没有本质改变Q而第三种Ҏ(gu)׃一样了Q代码中q没有关于具体Speaker的信息。也是_(d)如果下次q有什么改动的话,W三U方法的GreetingcL不需要修改,~译的。根据上文Spring的用介l,只需要改动xml文gplGreeting注入不同的Speaker了,q样代码的扩展性是不是提高了很多?<br />关于Spring的接口编E还有很多东西可以去挖掘Q后文还?x)提到有关Spring Proxy的接口编E,我这里先介绍q么多,有兴话可以去google更多的资料?br /><br />五、    应用Spring中的切面<br />Spring生来支持AOPQ首先来看几个概念:(x)<br />1、    切面(AspectQ:(x)切面是系l中抽象出来的的某一个功能模块,上文已经有过介绍Q这里不再多说?br />2、    通知QAdviceQ:(x)通知是切面的具体实现。也是说你的切面要完成什么功能,具体怎么做就是在通知里面完成的。这个名UC乎有点让解,{后面看了代码就明白了?br />3、    切入点QPointcutQ:(x)切入点定义了通知应该应用到系l的哪些地方。Spring只能控制到方法(有的AOP框架可以控制到属性)Q也是说你能在Ҏ(gu)调用之前或者之后选择切入Q执行额外的操作?br />4、    目标对象(TargetQ:(x)目标对象是被通知的对象。它可以是Q何类Q包括你自己~写的或者第三方cR有了AOP以后Q目标对象就只需要关注自q核心业务Q其他的功能Q比如日志,qAOP框架支持完成?br />5、    代理(ProxyQ:(x)单的Ԍ代理是通知应用到目标对象后产生的对象。Spring在运行时?x)给每个目标对象生成一个代理对象,以后所有对目标对象的操作都?x)通过代理对象来完成。只有这样通知才可能切入目标对象。对pȝ的其他部分来_(d)q个q程是透明的,也就是看h跟没用代理一栗?br />我ؓ(f)了简化,只介l这5个概c通过q几个概念应该能够理解Spring的切面编E了。如果需要深入了解Spring AOP的话再去学习(fn)其他概念也很快的?br />下面通过一个实际的例子来说明Spring的切面编E。l上文Greeting的例子,我们惛_Speaker每次说话之前记录Speaker被调用了?br />首先创徏一个LogAdvicec:(x)<br />代码片段12Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> LogAdvice <strong><font color="#0000ff">implements</font></strong> MethodBeforeAdvice  </li><li>{ </li><li>    <strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> before(<font color="#ff0000">Method</font> arg0, <strong><a target="_blank"><font class="classLink"><u>Object</u></font></a></strong>[] arg1, <strong><a target="_blank"><font class="classLink"><u>Object</u></font></a></strong> arg2)<strong><font color="#0000ff">throws</font></strong> <strong><a target="_blank"><font class="classLink"><u>Throwable</u></font></a></strong>  </li><li>    { </li><li>        <strong><a target="_blank"><font class="classLink"><u>System</u></font></a></strong>.out.println(<font color="#ff33ff">"Speaker called!"</font>); </li><li>    } </li><li>} </li></ol></div>q里涉及(qing)C个类QMethodBeforeAdviceQ这个类是Springcd提供的,cM的还有AfterReturningAdvice{等Q从字面p理解它们的含义。先不急着理解q个c,我稍后解释。我们l看如何把这个类应用到我们的pȝ中去?br />代码片段13Q?br /><div id="wmqeeuq" class="codeStyle"><ol><li><beans> </li><li>    <bean id=<font color="#ff33ff">"Speaker"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Speaker"</font>/> </li><li>    <bean id=<font color="#ff33ff">"Greeting"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Greeting"</font>> </li><li>        <property name=<font color="#ff33ff">"speaker"</font>> </li><li>            <ref bean=<font color="#ff33ff">"SpeakerProxy"</font>/> </li><li>        </property> </li><li>    </bean> </li><li>    <bean id=<font color="#ff33ff">"LogAdvice"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"LogAdvice"</font>/> </li><li>    <bean id=<font color="#ff33ff">"SpeakerProxy"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"org.springframework.aop.framework.ProxyFactoryBean"</font>> </li><li>        <property name=<font color="#ff33ff">"proxyInterfaces"</font>> </li><li>            <value>ISpeaker</value> </li><li>        </property> </li><li>        <property name=<font color="#ff33ff">"interceptorNames"</font>> </li><li>            <list> </li><li>                <value>LogAdvice</value> </li><li>            </list> </li><li>        </property> </li><li>        <property name=<font color="#ff33ff">"target"</font>> </li><li>            <ref local=<font color="#ff33ff">"Speaker"</font>/> </li><li>        </property> </li><li>    </bean> </li><li></beans> </li></ol></div><br />可以看到我们的配|文件中多了两个beanQ一个LogAdviceQ另外一个SpeakerProxy。LogAdvice很简单。我着重分析一下SpeakerProxy。这个Bean实际上是由Spring提供的ProxyFactoryBean实现。下面定义了三个依赖注入的属性?br />1、    proxyInterfactesQ这个属性定义了q个Proxy要实现哪些接口,可以是一个,也可以是多个Q多个的话,要用list标签Q。我前面讲过Proxy是在q行是动态创建的Q那么这个属性就告诉Spring创徏q个Proxy的时候实现哪些接口?br />2、    interceptorNamesQ这个属性定义了Proxy被切入了哪些通知Q这里只有一个LogAdvice?br />3、    targetQ这个属性定义了被代理的对象。在q个例子中target是Speaker?br />q样的定义实际上U束了被代理的对象必dC个接口,q与上文讲的面向接口的编E有点类伹{其实可以这L(fng)解,接口的定义可以让pȝ的其他部分不受媄响,以前用ISpeaker接口来调用,现在加入了Proxyq是一L(fng)。但实际上内容已l不一样了Q以前是SpeakerQ现在是一个Proxy。而target属性让proxy知道具体的方法实现在哪里。Proxy可以看作是target的一个包装。当然Springq没有强制要求用接口Q通过CGLIBQ一个高效的代码生成开源类库)也可以直接根据目标对象生成子c,但这U方式ƈ不推荐?br />我们q像以前一L(fng)试我们的GreetingpȝQ测试代码和代码片段8是一L(fng)。运行结果如下:(x)<br /><strong>Speaker called!<br />Hello!</strong><br />看到效果了吧Q而且你可以发玎ͼ我们加入Log功能q没有改变以前的代码Q甚x试代码都没有改变Q这是AOP的魅力所在!我们更改的只是配|文件?br />下面解释一下刚才落下的MethodBeforeAdvice。关于这个类我ƈ不详l介l,因ؓ(f)q涉?qing)到Spring中的另外一个概念“连接点QJointpointQ”,我详l介l一个beforeq个Ҏ(gu)。这个方法有三个参数arg0表示目标对象在哪个点被切入了Q既然是MethodBeforeAdviceQ那当然是在Method之前被切入了。那么arg0是表示的那个Method。第二个参数arg1是Method的参敎ͼ所以类型是Object[]。第三个参数是目标对象了,在Greeting例子中arg2的类型实际上是Speaker?br />在Greeting例子中,我们q没有指定目标对象的哪些Ҏ(gu)要被切入Q而是默认切入所有方法调用(虽然Speaker只有一个方法)。通过自定义PointcutQ可以控制切入点Q我q里不再介绍了,因ؓ(f)qƈ不媄响理解Spring AOPQ有兴趣的话去google一下就知道了?br /><br />六、实战Spring<br />虽然q部分取名ؓ(f)“实战Spring”,但实际上我ƈ不打在q里介绍实际开发Spring的内容,因ؓ(f)我写q篇文章的目的是介绍Spring的概念和用Spring开发的思\Q而不是有关Spring的实践和详细介绍。文中介l的内容和用Spring做实际开发还相去甚远。之所以取名“实战Spring”是我觉得理解了上文讲的内容以后Q可以开始ؓ(f)深入学习(fn)Spring和学?fn)如何在目中应用Spring了?br />要系l的学习(fn)Springq是需要阅M本详l介lSpring的书Q我推荐Spring in ActionQ因为我看的是q本书。希望这文章能Zpȝ的学?fn)Spring扫除一些障?br /><br /><br /></div></div><img src ="http://www.aygfsteel.com/wujian929/aggbug/68281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-09-07 14:22 <a href="http://www.aygfsteel.com/wujian929/archive/2006/09/07/68281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>q是我的W一个blog~~~~呵呵Q?/title><link>http://www.aygfsteel.com/wujian929/archive/2006/03/13/35134.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Mon, 13 Mar 2006 14:20:00 GMT</pubDate><guid>http://www.aygfsteel.com/wujian929/archive/2006/03/13/35134.html</guid><wfw:comment>http://www.aygfsteel.com/wujian929/comments/35134.html</wfw:comment><comments>http://www.aygfsteel.com/wujian929/archive/2006/03/13/35134.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wujian929/comments/commentRss/35134.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wujian929/services/trackbacks/35134.html</trackback:ping><description><![CDATA[       <FONT style="BACKGROUND-COLOR: #ffffff">今天距我学习(fn)java已经有半q了吧,可是感觉自己没学C么。一个偶然的Z(x)让我x有自qblogQ想用它记录我自己学java的点Ҏ(gu)滴。希望在大学剩下的有限的几年中,我不再浪Ҏ(gu)的青春,能够脚踏实地地学点东西!写到这了,希望有一天我是一个牛人!</FONT><img src ="http://www.aygfsteel.com/wujian929/aggbug/35134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wujian929/" target="_blank">lovetq</a> 2006-03-13 22:20 <a href="http://www.aygfsteel.com/wujian929/archive/2006/03/13/35134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">ƽɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ר</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">౱</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϰ</a>| <a href="http://" target="_blank">³</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ͨμ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">IJ</a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank">ٳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ŷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͳ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>