﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-java ------- I come!</title><link>http://www.blogjava.net/wujian929/</link><description>专业是一种精神！</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:05:10 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:05:10 GMT</pubDate><ttl>60</ttl><item><title>点击大标题显示与隐藏小标题</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/10/25/77243.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/77243.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/10/25/77243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/77243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/77243.html</trackback:ping><description><![CDATA[
		<font color="#ff1493">&lt;SCRIPT language=javascript1.2&gt;<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 />&lt;/SCRIPT&gt;<br /></font>
		<br />
		<br />
		<font color="#7fffd4">
				<font color="#0000ff">用法：</font>
				<br />
		</font>
		<br />&lt;tr&gt;<br />            &lt;td height="26" background="../image/menu.gif" id="menuTitle1" onClick="showsubmenu(1)" style="cursor:hand;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />            &lt;font color="#FF9900"&gt;■&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#FFFFFF"&gt;&lt;strong&gt;知识库分类&lt;/strong&gt;&lt;/font&gt;<br />            &lt;/td&gt;<br />          &lt;/tr&gt;<br />          &lt;tr&gt;<br />&lt;td style="display:none" id='submenu1'&gt;<br />     &lt;table cellspacing="0" align="center" width="100%"&gt;<br />                &lt;tr&gt;<br />                  &lt;td class="nav"&gt;· &lt;a href="&lt;%=request.getContextPath()%&gt;/knowledge/knowledgeCategoryList.htm?order=list" target="mainFrame"&gt;编辑知识库分类&lt;/a&gt;&lt;/td&gt;<br />                &lt;/tr&gt;<br />                &lt;tr&gt;<br />                  &lt;td class="nav"&gt;· &lt;a href="&lt;%=request.getContextPath()%&gt;/knowledge/knowledgeCategoryList.htm?order=edit" target="mainFrame"&gt;新增知识库分类&lt;/a&gt;&lt;/td&gt;<br />                &lt;/tr&gt;<br />              &lt;/table&gt;<img src ="http://www.blogjava.net/wujian929/aggbug/77243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-10-25 17:37 <a href="http://www.blogjava.net/wujian929/archive/2006/10/25/77243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>列表中的删除链接</title><link>http://www.blogjava.net/wujian929/archive/2006/10/25/77228.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Wed, 25 Oct 2006 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/wujian929/archive/2006/10/25/77228.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/77228.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/10/25/77228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/77228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/77228.html</trackback:ping><description><![CDATA[
		<font color="#ff1493">在很多的列表中，后面的操作一栏会有删除链接，并且会让你确认。此处的代码：</font> <br />&lt;a href='javascript:deleteCategory("&lt;%=article.getId() %&gt;")'&gt;删除&lt;/a&gt;<br />     <br /><br /><font color="#ff33ff">javascript函数</font><br />&lt;script&gt;<br /> function deleteCategory(articleId)<br /> {<br />  if(confirm('是否真的要删除该记录'))<br />   window.location='&lt;%=request.getContextPath()%&gt;/info/infoArticleEdit.htm?order=delete&amp;articleId='+articleId;<br /> }<br />&lt;/script&gt;<br /><br /><font color="#ff1493">一些链接：</font><br />&lt;input class="button3" type=button value="返回" onclick="javascript:window.location='&lt;%=request.getContextPath() %&gt;/info/infoArticleList.htm'"&gt;<br /><br />&lt;td&gt;文件名：&lt;a href='&lt;%=request.getContextPath()%&gt;/info/infoArticleEdit.htm?order=download&amp;fileId=&lt;%=accessory.getId() %&gt;'&gt;&lt;%=accessory.getFileExt() %&gt;&lt;/a&gt;<br />     <br />&lt;c:url value="........" /&gt;<br /><font color="#ff1493">  <br />一些传值<br /></font><font color="#000000">&lt;input type=hidden name=order value=save&gt;<br />&lt;input type=hidden name=id value="&lt;c:out value="${infoArticle.id}" /&gt;"&gt;<br />&lt;input type=hidden name=navId value="&lt;%=request.getParameter("navId") %&gt;"&gt;<br />&lt;input type=hidden name=fileCount value=1&gt;</font><img src ="http://www.blogjava.net/wujian929/aggbug/77228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-10-25 16:32 <a href="http://www.blogjava.net/wujian929/archive/2006/10/25/77228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多选框的操作及传值</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/10/25/77121.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/77121.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/10/25/77121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/77121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/77121.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<font color="#800080">
								<font color="#ff1493">页面代码：</font>
								<br />
						</font>
				</strong>&lt;!--  这个是显示的多选框页面 已有的角色要打勾，可以重新选择角色--&gt;<br />&lt;form action="&lt;c:url value="/sys/userRolesEdit.htm"/&gt;" method="post" &gt;</p>
		<p>      &lt;table class="grid" width="100%" cellspacing="1"&gt;<br />      <br />    &lt;tr&gt;<br />       &lt;td colspan="6" class="title"&gt;<br />          角色列表<br />       &lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt;<br />      &lt;td class="column"&gt;&lt;/td&gt;<br />       &lt;td class="column"&gt;角色ID&lt;/td&gt;<br />       &lt;td class="column"&gt;角色名&lt;/td&gt;<br />       &lt;td class="column"&gt;角色代码&lt;/td&gt;<br />       &lt;td class="column"&gt;角色描述&lt;/td&gt;       </p>
		<p>    &lt;/tr&gt;</p>
		<p>    <font color="#ff1493">&lt;!-- 循环显示列表userRoles的每一项，并判断如果数据库中已有的打勾&lt;c:if test标签正确才执行中间的代码--&gt;<br /></font>    &lt;c:forEach items="${roles}" var="item"&gt;    <br />   &lt;tr&gt;      <br />     &lt;td&gt;<br />     &lt;input type="checkbox" name="rolesId" &lt;c:forEach items="${userRoles}" var = "selectedRoles"&gt;<br />     &lt;c:if test="${item.srolId == selectedRoles.srolId}"&gt;checked="true"&lt;/c:if&gt;&lt;/c:forEach&gt;<br />      value="&lt;c:out value="${item.srolId}"/&gt;" /&gt;<br />     &lt;/td&gt;<br />   <br />     &lt;td&gt;&lt;c:out value="${item.srolId}"/&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;c:out value="${item.srolName}"/&gt; &lt;/td&gt;<br />                 &lt;td&gt;&lt;c:out value="${item.srolCode}"/&gt;&lt;/td&gt;<br />                 &lt;td&gt;&lt;c:out value="${item.srolDesc}"/&gt;&lt;/td&gt;                 <br />     &lt;tr&gt;       <br />    &lt;/c:forEach&gt;    <br />    <br />    &lt;tr&gt;</p>
		<p>       &lt;td colspan="6" class="nav"&gt;&amp;nbsp;<br />           &lt;input type="hidden" name="userID"<br />   value=&lt;c:out value="${userInfo.suinId}"/&gt;&gt;<br />      &lt;input type="submit" class="button3" value="提交"/&gt;<br />      &lt;INPUT type="button" class="button2" value="返回" onclick="history.back()" /&gt;<br />      <br />       &lt;/td&gt;<br />    &lt;/tr&gt;<br />   &lt;/table&gt; <br />   &lt;/form&gt;<br /><br /><strong><font color="#ff1493">控制器代码：<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 &amp;&amp; !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"> //这里就是从列表多选框传过来的数值。根据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">//先删除数据库中所有的，再插入所选的值<br /></font>         for (int k = 0; k &lt; userRoles.size(); k++)<br />      {<br />       SysUserRole userRole = (SysUserRole)userRoles.get(k);      <br />       sysService.delete(userRole);<br />       <br />      }<br />         <br />         for (int i = 0; i &lt; 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配置文件中，successView不能传递参数，可在这里直接有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.blogjava.net/wujian929/aggbug/77121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-10-25 09:27 <a href="http://www.blogjava.net/wujian929/archive/2006/10/25/77121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizer：字符串分隔解析类型（转）</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/10/08/73872.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/73872.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/10/08/73872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/73872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/73872.html</trackback:ping><description><![CDATA[
		<strong>StringTokenizer：字符串分隔解析类型<br /></strong>
		<span style="COLOR: indigo">属于：java.util包。</span>
		<br />
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。<br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。<br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>1. <span style="COLOR: green">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。<br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>：返回是否还有分隔符。<br />3. <span style="COLOR: green">boolean hasMoreElements() </span>：结果同2。<br />4. <span style="COLOR: green">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。<br />5. <span style="COLOR: green">Object nextElement() </span>：结果同4。<br />6. <span style="COLOR: green">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。</ul>
		<br />
		<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);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />　　　　　　　　　　　}<br />结果为：<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">例2:</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 />结果为：<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.blogjava.net/wujian929/aggbug/73872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-10-08 17:33 <a href="http://www.blogjava.net/wujian929/archive/2006/10/08/73872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp</title><link>http://www.blogjava.net/wujian929/archive/2006/09/21/71074.html</link><dc:creator>lovetq</dc:creator><author>lovetq</author><pubDate>Thu, 21 Sep 2006 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/wujian929/archive/2006/09/21/71074.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/71074.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/09/21/71074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/71074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/71074.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word" height="100%" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td valign="top">
										<a href="http://www.nohack.cn/bbs/misc.php?action=viewratings&amp;tid=21556&amp;pid=1129313674" name="pid1129313674" alt="查看评分记录">
										</a>
										<strong>
												<font size="2">
														<font face="Arial">
																<span class="smalltxt">
																		<span class="bold">JSP语法（9）——jsp:getProperty</span>
																</span>
																<br />
																<br />
														</font>
												</font>
										</strong>
										<span style="FONT-SIZE: 12px">&lt;jsp:getProperty&gt;<br /><br />获取Bean的属性值，用于显示在页面中<br /><br />JSP 语法<br /><br />&lt;jsp:getProperty name="beanInstanceName" property="propertyName" /&gt;<br /><br />例子<br /><br />&lt;jsp:useBean id="calendar" scope="page" class="employee.Calendar" /&gt;<br /><br />&lt;h2&gt;<br /><br />Calendar of &lt;jsp:getProperty name="calendar" property="username" /&gt;<br /><br />&lt;/h2&gt;<br /><br />描述<br /><br />这个&lt;jsp:getProperty&gt;元素将获得Bean的属性值，并可以将其使用或显示在JSP页面中.在你使用&lt;jsp:getProperty&gt;之前，你必须用&lt;jsp:useBean&gt;创建它.<br /><br />&lt;jsp:getProperty&gt;元素有一些限制:<br /><br />你不能使用&lt;jsp:getProperty&gt;来检索一个已经被索引了的属性<br /><br />你能够和JavaBeans组件一起使用&lt;jsp:getProperty&gt;,但是不能与Enterprise<br /><br />Bean一起使用。<br /><br />属性<br /><br />name="beanInstanceName"<br />bean的名字,由&lt;jsp:useBean&gt;指定<br /><br />property="propertyName"<br />所指定的Bean的属性名。<br /><br />技巧:<br /><br />在sun的JSP参考中提到，如果你使用&lt;jsp:getProperty&gt;来检索的值是空值，那么NullPointerException将会出现，同时如果使用程序段或表达式来检索其值，那么在浏览器上出现的是null（空).</span>
										<!--论坛一楼广告代码开始-->
										<br />
										<script type="text/javascript">
												<!--
google_ad_client = "pub-0235996362693247";
google_alternate_color = "F7F8FB";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel ="5454488077";
google_color_border = "F7F8FB";
google_color_bg = "F7F8FB";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
										</script>
										<br />
										<br />
										<table cellspacing="10" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td class="showTitle" align="middle">jsp:getProperty Action</td>
														</tr>
														<tr>
																<td>
																		<table cellspacing="0" cellpadding="5" width="100%" border="0">
																				<tbody>
																						<tr>
																								<td align="middle" height="5">
																								</td>
																						</tr>
																						<tr>
																								<td>
																										<p>语法： <br /><br />　　&lt;jsp:getProperty name="beanInstanceName" property="propertyName" /&gt; <br /><br />　　这个属性检索出bean的属性的值并将之转化为一个字符串，然后将之插入到输出。它有两个必选属性：name，在之前用jsp:useBean引入的名称，property，必须被插入值的属性。</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
										</script>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/wujian929/aggbug/71074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-09-21 13:46 <a href="http://www.blogjava.net/wujian929/archive/2006/09/21/71074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Calendar的用法</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/09/21/71048.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/71048.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/09/21/71048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/71048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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 &gt; 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 &gt; 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.blogjava.net/wujian929/aggbug/71048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-09-21 11:45 <a href="http://www.blogjava.net/wujian929/archive/2006/09/21/71048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp:setProperty的使用（转别人的）</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/09/21/71044.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/71044.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/09/21/71044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/71044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/71044.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">&lt;jsp:useBean id=“calculator“ scope=“request“ class=“com.jspdev.SimpleCalculator“&gt;<br />&lt;jsp:setProperty name=“calculator“ property=“*“/&gt;<br />&lt;/jsp:useBean&gt;<br /><br />(1)property=”*”<br />设置Bean 属性的快捷方式，在Bean 中属性的名字，类型必须和request对象中的参数名称相匹配。由于表单中传过来的数据类型都是String 类型的，Jsp内在机制会把这些参数转化成Bean属性对应的类型。<br />(2)property=“propertyName“<br />使用request对象中的一个参数值来指定Bean中的一个属性值。在这个语法中，property指定Bean 的属性名，而且Bean 属性和request参数的名字应相同。也就是说，如果在Bean 中有setUserName(String userName)方法，那么，propertyName的值就是“userName“<br /><br />&lt;jsp:setProperty name="Name" property="*" /&gt;<br />根据已提交表单中的数据，设置这个javaBean中相应的属性值。<br />*:JavaBean属性的名称和表单对象的名称相同时才能够赋值<br />&lt;jsp:setProperty name="Name" property="propertyName" value="PropertyValue" | param="ParameterName" /&gt;<br />把JavaBean指定的属性设为指定的值<br /><br />jsp:setProperty用来设置Bean的属性值。<br />有两种方法使用<br />1。在jsp:useBean之后2。在jsp:useBean实体这中间有区别的第一种情况jsp:setProperty<br />不管是新生成的实例还是原来的对象，都会进行<br />2。只有在新生成的情况下才可以执行<br />&lt;jsp:setProperty&gt;中的name 应该和jsp:useBean中的id一样的<br />property="*" 表示用用户输入的所有值来匹配Bean中的属性，当然你也可以指定的<br /><br /></span>
<img src ="http://www.blogjava.net/wujian929/aggbug/71044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-09-21 11:34 <a href="http://www.blogjava.net/wujian929/archive/2006/09/21/71044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载好文章（spring）</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/09/07/68281.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/68281.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/09/07/68281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/68281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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();}]]&gt;</script>
  
<div class="post" id="article"><div class="postTitle"><a href="http://blog.csdn.net/chinayaoming/archive/2006/05/05/709160.aspx"><img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> 理解spring</a>(转的别人的）</div><div class="postText"><br /><br />最近研究Spring，她包含的编程思想让我耳目一新。所以写下这篇入门级文章供新手参考。我不是什么Spring的资深研究人员，我只是现学现卖。所以文章也只能是肤浅单薄，错误难免，还请见谅。<br />一、    Spring诞生<br />Spring是一个开源框架，目前在开源社区的人气很旺，被认为是最有前途的开源框架之一。她是由Rod Johnson创建的，她的诞生是为了简化企业级系统的开发。说道Spring就不得不说EJB，因为Spring在某种意义上是EJB的替代品，她是一种轻量级的容器。用过EJB的人都知道EJB很复杂，为了一个简单的功能你不得不编写多个Java文件和部署文件，他是一种重量级的容器。也许你不了解EJB，你可能对“轻（重）量级”和“容器”比较陌生，那么这里我简单介绍一下。<br />1、什么是容器<br />“容器”，这个概念困扰我好久。从学习Tomcat开始就一直对此感到困惑。感性的来讲，容器就是可以用来装东西的物品。那么在编程领域就是指用来装对象（OO的思想，如果你连OO都不了解，建议你去学习OO先）的对象。然而这个对象比较特别，它不仅要容纳其他对象，还要维护各个对象之间的关系。这么讲可能还是太抽象，来看一个简单的例子：<br />代码片断1：<br /><div 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 />可以看到这里的Container类（容器）在初始化的时候会生成一个Speaker对象和一个Greeting对象，并且维持了它们的关系，当系统要用这些对象的时候，直接问容器要就可以了。这就是容器最基本的功能，维护系统中的实例（对象）。如果到这里你还是感到模糊的话，别担心，我后面还会有相关的解释。<br /><br />2、轻量级与重量级<br />所谓“重量级”是相对于“轻量级”来讲的，也可以说“轻量级”是相对于重量级来讲的。在Spring出现之前，企业级开发一般都采用EJB，因为它提供的事务管理，声明式事务支持，持久化，分布计算等等都“简化”了企业级应用的开发。我这里的“简化”打了双引号，因为这是相对的。重量级容器是一种入侵式的，也就是说你要用EJB提供的功能就必须在你的代码中体现出来你使用的是EJB，比如继承一个接口，声明一个成员变量。这样就把你的代码绑定在EJB技术上了，而且EJB需要JBOSS这样的容器支持，所以称之为“重量级”。<br />相对而言“轻量级”就是非入侵式的，用Spring开发的系统中的类不需要依赖Spring中的类，不需要容器支持（当然Spring本身是一个容器），而且Spring的大小和运行开支都很微量。一般来说，如果系统不需要分布计算或者声明式事务支持那么Spring是一个更好的选择。<br /><br />二、    几个核心概念<br />在我看来Spring的核心就是两个概念，反向控制（IoC），面向切面编程（AOP）。还有一个相关的概念是POJO，我也会略带介绍。<br />1、POJO<br />我所看到过的POJO全称有两个，Plain Ordinary Java Object，Plain Old Java Object，两个差不多，意思都是普通的Java类，所以也不用去管谁对谁错。POJO可以看做是简单的JavaBean（具有一系列Getter，Setter方法的类）。严格区分这里面的概念没有太大意义，了解一下就行。<br />2、    IoC<br />IoC的全称是Inversion of Control，中文翻译反向控制或者逆向控制。这里的反向是相对EJB来讲的。EJB使用JNDI来查找需要的对象，是主动的，而Spring是把依赖的对象注入给相应的类（这里涉及到另外一个概念“依赖注入”，稍后解释），是被动的，所以称之为“反向”。先看一段代码，这里的区别就很容易理解了。<br />代码片段2：<br /><div 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 />代码片段3：<br /><div 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 />代码片段4：<br /><div 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 />我们可以对比一下这三段代码。其中片段2是不用容器的编码，片段3是EJB编码，片段4是Spring编码。结合代码片段1，你能看出来Spring编码的优越之处吗？也许你会觉得Spring的编码是最复杂的。不过没关系，我在后面会解释Spring编码的好处。<br />这里我想先解释一下“依赖注入”。根据我给的例子可以看出，Greeting类依赖Speaker类。片段2和片段3都是主动的去获取Speaker，虽然获取的方式不同。但是片段4并没有去获取或者实例化Speaker类，而是在greeting函数中直接使用了s。你也许很容易就发现了，在构造函数中有一个s被注入（可能你平时用的是，传入）。在哪里注入的呢？请回头看一下代码片段1，这就是使用容器的好处，由容器来维护各个类之间的依赖关系（一般通过Setter来注入依赖，而不是构造函数，我这里是为了简化示例代码）。Greeting并不需要关心Speaker是哪里来的或是从哪里获得Speaker，只需要关注自己分内的事情，也就是让Speaker说一句问候的话。<br />3、    AOP<br />AOP全称是Aspect-Oriented Programming，中文翻译是面向方面的编程或者面向切面的编程。你应该熟悉面向过程的编程，面向对象的编程，但是面向切面的编程你也许是第一次听说。其实这些概念听起来很玄，说到底也就是一句话的事情。<br />现在的系统往往强调减小模块之间的耦合度，AOP技术就是用来帮助实现这一目标的。举例来说，假如上文的Greeting系统含有日志模块，安全模块，事务管理模块，那么每一次greet的时候，都会有这三个模块参与，以日志模块为例，每次greet之后，都要记录下greet的内容。而对于Speaker或者Greeting对象来说，它们并不知道自己的行为被记录下来了，它们还是像以前一样的工作，并没有任何区别。只是容器控制了日志行为。如果这里你有点糊涂，没关系，等讲到具体Spring配置和实现的时候你就明白了。<br />假如我们现在为Greeting系统加入一个Valediction功能，那么AOP模式的系统结构如下：<br />G|RET|TIN|G<br />V|ALE|DIT|ION<br />|   |   |<br />日志 安全 事务<br /><br />这些模块是贯穿在整个系统中的，为系统的不同的功能提供服务，可以称每个模块是一个“切面”。其实“切面”是一种抽象，把系统不同部分的公共行为抽取出来形成一个独立的模块，并且在适当的地方（也就是切入点，后文会解释）把这些被抽取出来的功能再插入系统的不同部分。<br />从某种角度上来讲“切面”是一个非常形象的描述，它好像在系统的功能之上横切一刀，要想让系统的功能继续，就必须先过了这个切面。这些切面监视并拦截系统的行为，在某些（被指定的）行为执行之前或之后执行一些附加的任务（比如记录日志）。而系统的功能流程（比如Greeting）并不知道这些切面的存在，更不依赖于这些切面，这样就降低了系统模块之间的耦合度。<br /><br />三、    Spring初体验<br />这一节我用一个具体的例子Greeting，来说明使用Spring开发的一般流程和方法，以及Spring配置文件的写法。<br />首先创建一个Speaker类，你可以把这个类看做是POJO。<br />代码片段5：<br /><div 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 href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" 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>再创建一个Greeting类。<br />代码片段6：<br /><div 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 />然后要创建一个Spring的配置文件把这两个类关联起来。<br />代码片段7（applicationContext.xml）：<br /><div class="codeStyle"><ol><li>&lt;?xml version=<font color="#ff33ff">"1.0"</font> encoding=<font color="#ff33ff">"UTF-8"</font>?&gt; 
</li><li>&lt;!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>&gt; 
</li><li></li><li>&lt;beans&gt; 
</li><li>    &lt;bean id=<font color="#ff33ff">"Speaker"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Speaker"</font>&gt;&lt;/bean&gt; 
</li><li>    &lt;bean id=<font color="#ff33ff">"Greeting"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Greeting"</font>&gt; 
</li><li>        &lt;property name=<font color="#ff33ff">"speaker"</font>&gt; 
</li><li>            &lt;ref bean=<font color="#ff33ff">"Speaker"</font>/&gt; 
</li><li>        &lt;/property&gt; 
</li><li>    &lt;/bean&gt; 
</li><li>&lt;/beans&gt; </li></ol></div><br />要用Spring Framework必须把Spring的包加入到Classpath中，我用的是Eclipse+MyEclipse，这些工作是自动完成的。推荐用Spring的配置文件编辑器来编辑，纯手工编写很容易出错。我先分析一下这个xml文件的结构，然后再做测试。从&lt;beans&gt;节点开始，先声明了两个&lt;bean&gt;，第二个bean有一个speaker属性（property）要求被注入，注入的内容是另外一个bean Speaker。这里的命名是符合JavaBean规范的，也就是说如果是speaker属性，那么Spring容器就会调用setSpeaker()来注入这个属性。&lt;ref&gt;是reference的意思，表示引用另外一个bean。<br />下面看一段简单的测试代码：<br />代码片段8：<br /><div 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 href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" 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 />这段代码很简单，如果你上文都看懂了，那么这里应该没有问题。值得注意的是Spring有两种方式来创建容器（我们不再用上文我们自己编写的Container），一种是ApplicationContext，另外一种是BeanFactory。ApplicationContext更强大一些，而且使用上两者没有太大区别，所以一般说来都用ApplicationContext。Spring容器帮助我们维护我们在配置文件中声明的Bean以及它们之间的依赖关系，我们的Bean只需要关注自己的核心业务。<br /><br />四、    面向接口的编程<br />看了这么多，也许你并没有觉得Spring给开发带来了很多便利。那是因为我举的例子还不能突出Spring的优越之处，接下来我将通过接口编程来体现Spring的强大。<br />假如现在要求扩展Greeting的功能，要让Speaker用不同的语言来问候，也就是说有不同的Speaker，比如ChineseSpeaker, EnglishSpeaker。那么对上文提到的三种编码方式（代码片段2、3、4）分别加以修改，你会发现很麻烦。假如下次又要加入一个西班牙语，又得重复劳动。很自然的会考虑到使用一个ISpeaker接口来简化工作,，更改后的代码如下（这里没有列出接口的相关代码，我想你应该明白怎么写）：         <br /><br />代码片段9：<br /><div 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 />代码片段10：<br /><div 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 />代码片段11：<br /><div 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>对比三段代码，你会发现，第一种方法还是把具体的Speaker硬编码到代码中了，第二中方法稍微好一点，但是没有本质改变，而第三种方法就不一样了，代码中并没有关于具体Speaker的信息。也就是说，如果下次还有什么改动的话，第三种方法的Greeting类是不需要修改，编译的。根据上文Spring的使用介绍，只需要改动xml文件就能给Greeting注入不同的Speaker了，这样代码的扩展性是不是提高了很多？<br />关于Spring的接口编程还有很多东西可以去挖掘，后文还会提到有关Spring Proxy的接口编程，我这里先介绍这么多，有兴趣话可以去google更多的资料。<br /><br />五、    应用Spring中的切面<br />Spring生来支持AOP，首先来看几个概念：<br />1、    切面（Aspect）：切面是系统中抽象出来的的某一个功能模块，上文已经有过介绍，这里不再多说。<br />2、    通知（Advice）：通知是切面的具体实现。也就是说你的切面要完成什么功能，具体怎么做就是在通知里面完成的。这个名称似乎有点让人费解，等后面看了代码就明白了。<br />3、    切入点（Pointcut）：切入点定义了通知应该应用到系统的哪些地方。Spring只能控制到方法（有的AOP框架可以控制到属性），也就是说你能在方法调用之前或者之后选择切入，执行额外的操作。<br />4、    目标对象（Target）：目标对象是被通知的对象。它可以是任何类，包括你自己编写的或者第三方类。有了AOP以后，目标对象就只需要关注自己的核心业务，其他的功能，比如日志，就由AOP框架支持完成。<br />5、    代理（Proxy）：简单的讲，代理就是将通知应用到目标对象后产生的对象。Spring在运行时会给每个目标对象生成一个代理对象，以后所有对目标对象的操作都会通过代理对象来完成。只有这样通知才可能切入目标对象。对系统的其他部分来说，这个过程是透明的，也就是看起来跟没用代理一样。<br />我为了简化，只介绍这5个概念。通过这几个概念应该能够理解Spring的切面编程了。如果需要深入了解Spring AOP的话再去学习其他概念也很快的。<br />下面通过一个实际的例子来说明Spring的切面编程。继续上文Greeting的例子，我们想在Speaker每次说话之前记录Speaker被调用了。<br />首先创建一个LogAdvice类：<br />代码片段12：<br /><div 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 href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html" target="_blank"><font class="classLink"><u>Object</u></font></a></strong>[] arg1, <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html" target="_blank"><font class="classLink"><u>Object</u></font></a></strong> arg2)<strong><font color="#0000ff">throws</font></strong> <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/Throwable.java.html" target="_blank"><font class="classLink"><u>Throwable</u></font></a></strong>  
</li><li>    { 
</li><li>        <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" 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>这里涉及到一个类，MethodBeforeAdvice，这个类是Spring类库提供的，类似的还有AfterReturningAdvice等等，从字面就能理解它们的含义。先不急着理解这个类，我稍后解释。我们继续看如何把这个类应用到我们的系统中去。<br />代码片段13：<br /><div class="codeStyle"><ol><li>&lt;beans&gt; 
</li><li>    &lt;bean id=<font color="#ff33ff">"Speaker"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Speaker"</font>/&gt; 
</li><li>    &lt;bean id=<font color="#ff33ff">"Greeting"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"Greeting"</font>&gt; 
</li><li>        &lt;property name=<font color="#ff33ff">"speaker"</font>&gt; 
</li><li>            &lt;ref bean=<font color="#ff33ff">"SpeakerProxy"</font>/&gt; 
</li><li>        &lt;/property&gt; 
</li><li>    &lt;/bean&gt; 
</li><li>    &lt;bean id=<font color="#ff33ff">"LogAdvice"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"LogAdvice"</font>/&gt; 
</li><li>    &lt;bean id=<font color="#ff33ff">"SpeakerProxy"</font> <strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">"org.springframework.aop.framework.ProxyFactoryBean"</font>&gt; 
</li><li>        &lt;property name=<font color="#ff33ff">"proxyInterfaces"</font>&gt; 
</li><li>            &lt;value&gt;ISpeaker&lt;/value&gt; 
</li><li>        &lt;/property&gt; 
</li><li>        &lt;property name=<font color="#ff33ff">"interceptorNames"</font>&gt; 
</li><li>            &lt;list&gt; 
</li><li>                &lt;value&gt;LogAdvice&lt;/value&gt; 
</li><li>            &lt;/list&gt; 
</li><li>        &lt;/property&gt; 
</li><li>        &lt;property name=<font color="#ff33ff">"target"</font>&gt; 
</li><li>            &lt;ref local=<font color="#ff33ff">"Speaker"</font>/&gt; 
</li><li>        &lt;/property&gt; 
</li><li>    &lt;/bean&gt; 
</li><li>&lt;/beans&gt; </li></ol></div><br />可以看到我们的配置文件中多了两个bean，一个LogAdvice，另外一个SpeakerProxy。LogAdvice很简单。我着重分析一下SpeakerProxy。这个Bean实际上是由Spring提供的ProxyFactoryBean实现。下面定义了三个依赖注入的属性。<br />1、    proxyInterfactes：这个属性定义了这个Proxy要实现哪些接口，可以是一个，也可以是多个（多个的话，要用list标签）。我前面讲过Proxy是在运行是动态创建的，那么这个属性就告诉Spring创建这个Proxy的时候实现哪些接口。<br />2、    interceptorNames：这个属性定义了Proxy被切入了哪些通知，这里只有一个LogAdvice。<br />3、    target：这个属性定义了被代理的对象。在这个例子中target是Speaker。<br />这样的定义实际上约束了被代理的对象必须实现一个接口，这与上文讲的面向接口的编程有点类似。其实可以这样理解，接口的定义可以让系统的其他部分不受影响，以前用ISpeaker接口来调用，现在加入了Proxy还是一样的。但实际上内容已经不一样了，以前是Speaker，现在是一个Proxy。而target属性让proxy知道具体的方法实现在哪里。Proxy可以看作是target的一个包装。当然Spring并没有强制要求用接口，通过CGLIB（一个高效的代码生成开源类库）也可以直接根据目标对象生成子类，但这种方式并不推荐。<br />我们还像以前一样的测试我们的Greeting系统，测试代码和代码片段8是一样的。运行结果如下：<br /><strong>Speaker called!<br />Hello!</strong><br />看到效果了吧！而且你可以发现，我们加入Log功能并没有改变以前的代码，甚至测试代码都没有改变，这就是AOP的魅力所在！我们更改的只是配置文件。<br />下面解释一下刚才落下的MethodBeforeAdvice。关于这个类我并不详细介绍，因为这涉及到Spring中的另外一个概念“连接点（Jointpoint）”，我详细介绍一个before这个方法。这个方法有三个参数arg0表示目标对象在哪个点被切入了，既然是MethodBeforeAdvice，那当然是在Method之前被切入了。那么arg0就是表示的那个Method。第二个参数arg1是Method的参数，所以类型是Object[]。第三个参数就是目标对象了，在Greeting例子中arg2的类型实际上是Speaker。<br />在Greeting例子中，我们并没有指定目标对象的哪些方法要被切入，而是默认切入所有方法调用（虽然Speaker只有一个方法）。通过自定义Pointcut，可以控制切入点，我这里不再介绍了，因为这并不影响理解Spring AOP，有兴趣的话去google一下就知道了。<br /><br />六、实战Spring<br />虽然这部分取名为“实战Spring”，但实际上我并不打算在这里介绍实际开发Spring的内容，因为我写这篇文章的目的是介绍Spring的概念和用Spring开发的思路，而不是有关Spring的实践和详细介绍。文中介绍的内容和用Spring做实际开发还相去甚远。之所以取名“实战Spring”是我觉得理解了上文讲的内容以后，可以开始为深入学习Spring和学习如何在项目中应用Spring了。<br />要系统的学习Spring还是需要阅读一本详细介绍Spring的书，我推荐Spring in Action，因为我看的就是这本书。希望这篇文章能为你系统的学习Spring扫除一些障碍。<br /><br /><br /></div></div><img src ="http://www.blogjava.net/wujian929/aggbug/68281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-09-07 14:22 <a href="http://www.blogjava.net/wujian929/archive/2006/09/07/68281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这是我的第一个blog~~~~呵呵！</title><link>http://www.blogjava.net/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.blogjava.net/wujian929/archive/2006/03/13/35134.html</guid><wfw:comment>http://www.blogjava.net/wujian929/comments/35134.html</wfw:comment><comments>http://www.blogjava.net/wujian929/archive/2006/03/13/35134.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wujian929/comments/commentRss/35134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujian929/services/trackbacks/35134.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT style="BACKGROUND-COLOR: #ffffff">今天距我学习java已经有半年了吧，可是感觉自己没学到什么。一个偶然的机会让我想拥有自己的blog，想用它记录我自己学java的点点滴滴。希望在大学剩下的有限的几年中，我不再浪费我的青春，能够脚踏实地地学点东西！就写到这了，希望有一天我是一个牛人！</FONT><img src ="http://www.blogjava.net/wujian929/aggbug/35134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujian929/" target="_blank">lovetq</a> 2006-03-13 22:20 <a href="http://www.blogjava.net/wujian929/archive/2006/03/13/35134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>