﻿<?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-收获着，记录着......</title><link>http://www.blogjava.net/baputista/</link><description>Baputista</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 08:14:34 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 08:14:34 GMT</pubDate><ttl>60</ttl><item><title>通过读取xml文件动态建表 </title><link>http://www.blogjava.net/baputista/archive/2006/09/16/70083.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Sat, 16 Sep 2006 13:23:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/09/16/70083.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/70083.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/09/16/70083.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/70083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/70083.html</trackback:ping><description><![CDATA[
		<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;Stoke&gt;<br /> &lt;Name ID="1" Type="VarChar" Length="10" Index="True"&gt;Ada&lt;/Name&gt;<br /> &lt;Sex ID="2" Type="VarChar" Length="2"&gt;female&lt;/Sex&gt;<br /> &lt;Age ID="3" Type="Integer"&gt;21&lt;/Age&gt;<br /> &lt;Comm&gt;<br />  &lt;Mobile ID="4" Type="VarChar" Length="15"&gt;13300008888&lt;/Mobile&gt;<br />  &lt;Email ID="5" Type="VarChar" Length="30"&gt;Ada@gmail.com&lt;/Email&gt;<br /> &lt;/Comm&gt;<br />&lt;/Stoke&gt;<br /><br />将上面的xml描述在数据库中创建一张表<br /><br />import java.io.*;<br />import java.sql.*;<br />import java.util.*;<br />import javax.xml.parsers.*;<br />import org.w3c.dom.*;</p>
		<p>public class XmlToSql<br />{<br /> public static void getNode(NodeList nl,StringBuffer sql)<br /> {<br />  for(int i=0;i&lt;nl.getLength();i++)<br />  {<br />   Node node = nl.item(i);<br />   if(node.getNodeType() == Node.ELEMENT_NODE)<br />   {<br />    if(node.hasAttributes())<br />    {<br />     sql.append(node.getNodeName()+" ");<br />     NamedNodeMap attr = node.getAttributes();<br />     sql.append(attr.getNamedItem("Type").getNodeValue());<br />     if(attr.getNamedItem("Length")!=null)<br />     {<br />      sql.append("("+attr.getNamedItem("Length").getNodeValue()+")");<br />     }    <br />     sql.append(",");<br />     if(attr.getNamedItem("Index")!=null &amp;&amp; attr.getNamedItem("Index").getNodeValue().equals("True"))<br />     {<br />      sql.append("index index_"+node.getNodeName()+"("+node.getNodeName()+"),");<br />     }<br />    }<br />    else<br />    {<br />     getNode(node.getChildNodes(),sql);<br />    }       <br />   }<br />  }<br /> }<br /> <br /> public static void main(String[] args)<br /> {<br />  try<br />  {<br />   DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();<br />   DocumentBuilder builder = fac.newDocumentBuilder();<br />   Document document = builder.parse(new File("Data.xml"));<br />   <br />   Node node = document.getFirstChild();<br />   <br />   StringBuffer sql = new StringBuffer("create table temp(id int(11) NOT NULL auto_increment,");<br />   getNode(node.getChildNodes(),sql);<br />   sql.append("PRIMARY KEY  (id))");<br />   <br />   Class.forName("com.mysql.jdbc.Driver");<br />   String url ="jdbc:mysql://localhost/test";<br />   Connection conn= DriverManager.getConnection(url,"root","root");<br />   Statement stmt = conn.createStatement();<br />   stmt.execute(sql.toString());<br />  }<br />  catch(Exception e){<br />   e.printStackTrace();<br />  }<br /> } <br />}</p>
<img src ="http://www.blogjava.net/baputista/aggbug/70083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-09-16 21:23 <a href="http://www.blogjava.net/baputista/archive/2006/09/16/70083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate配置文件的几个例子</title><link>http://www.blogjava.net/baputista/archive/2006/09/09/68694.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Sat, 09 Sep 2006 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/09/09/68694.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/68694.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/09/09/68694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/68694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/68694.html</trackback:ping><description><![CDATA[
		<p>在这里主要讲两个我亲身体验到的例子与大家分享：<br /><br />1.多对一<br />2.继承<br /><br />这两个是在应用中最常见的地方：<br /><br /><strong>1.多对一</strong><br /><br />何谓多对一，以我的例子为例，在大学里，一个学院里有很多专业，一个专业下有很多班级<br /><br />专业的字段里会有学院的类型来标识它所在的学院，而学院里很少需要有专业的字段，若想查到学院里的专业，返回专业的List比把它放到学院里的Set变量更划算！所以在显示的应用中很少这样做，再有在学院的表里也不存在专业相关的描述，所以有画蛇添足之嫌。<br /><br />所以呢，专业对于学院，就是多对一了，所谓的多对一也是从专业的角度来看的！但是当我们初始化这个对象，或者持久化这个对象的时候，能否带上它的学院属性呢？这个很关键，也很必要，这就需要附加的一个属性来完成了：<br /><br />下面我们以学院专业为例子，来看看该怎么写这个配置文件：<br /><br /><font color="#ff1493">public class Institute<font color="#000000">//学院<br /></font>{<br /> private Integer id;<br /> private String institute;</font></p>
		<p>
				<font color="#ff1493">//get &amp; set<br />}<br /><br />public class Department <font color="#000000">//专业</font><br />{<br /> private Integer id;<br /> private Institute institute;<font color="#000000">//学院属性</font><br /> private String department;<br /><br />   //get &amp; set<br />}<br /></font>
				<br />下面就是配置文件了：<br /><br /><font color="#006400">&lt;hibernate-mapping&gt;</font></p>
		<p>
				<font color="#006400"> &lt;class name="subject.model.Institute"&gt;<br />      &lt;id name="id"&gt;<br />         &lt;generator class="increment"/&gt;<br />       &lt;/id&gt;<br /><br />      &lt;property name="institute"/&gt;<br /> &lt;/class&gt;<br /><br />&lt;class name="subject.model.Department"&gt;<br />      &lt;id name="id"&gt;<br />         &lt;generator class="increment" /&gt;<br />      &lt;/id&gt;<br /><br />      &lt;property name="department" /&gt;<br />      <br />      &lt;many-to-one name="institute" class="subject.model.Institute" <br />          column="instituteId" lazy="false"/&gt;<font color="#000000">//多对一，lazy="false"来将依赖延迟设置为false</font><br />   &lt;/class&gt;<br /> <br />&lt;/hibernate-mapping&gt;<br /></font>
				<br />所谓依赖延迟就是说，如果我们把他设置为true，那么我们得到的department中的该属性初始化为空，否则就有该属性了！<br /><br /><strong>2.继承<br /></strong><br />在我的系统中，存在三种用户，管理员、学生、教师，他们都有综合的属性，也有个性的地方，具体的类介绍如下：<br /><br /><font color="#0000ff">public abstract class User <font color="#000000">//父类用户<br /></font>{<br /> private Integer id;<br /> private String user;<br /> private String password;<br /> private String name;<br /> private String telphone;<br /> //get &amp; set<br />}<br /><br />public class Student extends User<font color="#000000">//学生</font><br />{<br /> private SchoolClass schoolClass;<br /> private String sn;<br />}<br /><br />public class Teacher extends User<font color="#000000">//教师</font><br />{<br /> private String level;<br /> private Boolean confirm;<br />}<br /><br />public class Admin extends User<font color="#000000">//管理员</font><br />{<br /> private String grade;<br />}<br /><br /></font><font color="#000000">在数据库中我把三种角色的对象存放在一个表中，用一个字段来区分三种角色，在hibernate映射继承时属于一种情况，可以参照书中的介绍：<br /><br /></font><font color="#000080">&lt;hibernate-mapping&gt;</font></p>
		<p>
				<font color="#000080"> &lt;class name="subject.model.User" discriminator-value="not null"&gt;</font>
				<font color="#000000">//这里的not null很关键，没这个就会出现问题</font>
		</p>
		<p>
				<font color="#000080">  &lt;id name="id"&gt;<br />   &lt;generator class="increment" /&gt;<br />  &lt;/id&gt;<br />  <br />  &lt;discriminator column="type" type="character" /&gt;<br />  <br />  &lt;property name="user" /&gt;<br />  &lt;property name="password" /&gt;<br />  &lt;property name="name" /&gt;<br />  &lt;property name="telphone" /&gt;</font>
		</p>
		<p>
				<font color="#000080">  &lt;subclass name="subject.model.Admin" discriminator-value="a"&gt;<font color="#000000">//存储对象类型的标识符</font><br />   &lt;property name="grade" column="sn" /&gt;<font color="#000000">//对于每种对象的字段都放到数据库的一列里了</font><br />  &lt;/subclass&gt;<br />  <br />  &lt;subclass name="subject.model.Teacher" discriminator-value="t"&gt;<br />   &lt;property name="level" column="sn" /&gt;<br />   &lt;property name="confirm" column="about" /&gt;<br />  &lt;/subclass&gt;<br />  <br />  &lt;subclass name="subject.model.Student" discriminator-value="s"&gt;<br />   <br />   &lt;property name="sn" /&gt;<br />   <br />   &lt;many-to-one name="schoolClass" class="subject.model.SchoolClass" <br />    column="about" lazy="false"/&gt;<br />    <br />  &lt;/subclass&gt;</font>
		</p>
		<p>
				<font color="#000080"> &lt;/class&gt;</font>
		</p>
		<p>
				<font color="#000080">&lt;/hibernate-mapping&gt;<br /></font>
		</p>
<img src ="http://www.blogjava.net/baputista/aggbug/68694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-09-09 12:02 <a href="http://www.blogjava.net/baputista/archive/2006/09/09/68694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从分页来体验Struts的诟病</title><link>http://www.blogjava.net/baputista/archive/2006/09/09/68687.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Sat, 09 Sep 2006 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/09/09/68687.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/68687.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/09/09/68687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/68687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/68687.html</trackback:ping><description><![CDATA[
		<p>我曾经介绍过自己构建的分页程序，在那个程序中，我们把分页显示的数据放到了Action的成员中，而没有放在execute函数中，如果把他放到execute函数中会产生什么效果呢？由于我们没有采用页码来确定数据，而是单纯的调用下一页来完成的，所以当变量放到execute中时我们每次访问到的都只会是第一页，这就是Struts的诟病，单用户每次访问都会为用户创建一个新的线程，而非Servlet为每用户单独开辟一个线程，所以才会产生以上的问题？<br /><br />那问题该如何解决呢？<br /><br />1.用页码来区分需要显示的数据更有效<br />2.Spring可以解决这个诟病<br /><br />合二为一来介绍一下吧：<br /><br /><font color="#ff0000">/**<br /> * Page.java<br /> * @author baputista<br /> * Email: </font><a href="mailto:baputista@hotmail.com"><font color="#ff0000">baputista@hotmail.com</font></a><br /><font color="#ff0000"> * 2006-8-26 0:05:36<br /> */</font></p>
		<p>
				<font color="#ff0000">package subject.bean;</font>
		</p>
		<p>
				<font color="#ff0000">import java.util.ArrayList;<br />import java.util.List;</font>
		</p>
		<p>
				<font color="#ff0000">public class Page<br />{<br /> private int current = 1; <font color="#000000">//当前页码</font><br /> private int nextPage = 0; <font color="#000000">//下一页码</font><br /> private int previousPage = 0;<font color="#000000">//上一页码</font><br /> private int total = 0;<font color="#000000">//总的数据</font><br /> private int pages = 0;<font color="#000000">//总页数</font><br /> private int each = 5;<font color="#000000">//每页数据</font><br /> private int start = 0;<font color="#000000">//当前页的起始数据</font><br /> private int end = 0;<font color="#000000">//当前页的结束数据</font><br /> private boolean next = false;<font color="#000000">//是否存在下一页</font><br /> private boolean previous = false;<font color="#000000">//是否存在上一页</font><br /> private List list = null;</font>
				<font color="#000000">//需要显示的数据</font>
		</p>
		<p>
				<font color="#ff0000"> public Page( List list, int each )<font color="#000000">//以需要显示的数据和每页要显示的数据为参数进行初始化</font><br /> {<br />  this.list = list;<br />  this.each = each;<br />  total = list.size();<font color="#000000">//总的数据等于List的大小</font><br />  if ( total % each == 0 )<font color="#000000">//总页数和没页显示的数据可以整除，则为总页数</font><br />   pages = total / each;<br />  else<br />   pages = total / each + 1;<font color="#000000">//否则就需要加上一页了</font><br />  if ( current &gt;= pages )<br />  {<br />   next = false;<font color="#000000">//判断是否有下一页</font><br />  }<br />  else<br />  {<br />   next = true;<br />   nextPage = current + 1;<font color="#000000">//有，还得算出来下一页是多少呢！</font><br />  }<br />  if ( total &lt; each )<br />  {<br />   start = 0;<font color="#000000">//这页显示多少数据啊？如果是最后一页，只显示整除后的余数了</font><br />   end = total;<br />  }<br />  else<br />  {<br />   start = 0;<font color="#000000">//否则要显示每页需要显示的数据数</font><br />   end = each;<br />  }<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public int getCurrent()<br /> {<br />  return current;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public boolean isNext()<br /> {<br />  return next;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public boolean isPrevious()<br /> {<br />  return previous;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public int getPages()<br /> {<br />  return pages;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public int getTotal()<br /> {<br />  return total;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public int getNextPage()<br /> {<br />  return nextPage;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> public int getPreviousPage()<br /> {<br />  return previousPage;<br /> }</font>
		</p>
		<p>
				<font color="#ff0000"> @SuppressWarnings ( "unchecked" )<br /> public List get( int page )<font color="#000000">//获取指定页码的List</font><br /> {<br />  if ( page &gt; 0 &amp;&amp; page &lt;= pages )<br />  {<br />   current = page;<font color="#000000">//page在有效范围内则为当前页</font><br />  }<br />  if ( ( current - 1 ) &gt; 0 )<font color="#000000">//计算上一页是否存在以及值</font><br />  {<br />   previous = true;<br />   previousPage = current - 1;<br />  }<br />  else<br />  {<br />   previous = false;<br />  }<br />  if ( current &gt;= pages )<font color="#000000">//计算下一页是否存在以及值</font><br />  {<br />   next = false;<br />  }<br />  else<br />  {<br />   next = true;<br />   nextPage = current + 1;<br />  }<br />  if ( page * each &lt; total )<font color="#000000">//计算显示的记录在List中的位置</font><br />  {<br />   end = current * each;<br />   start = end - each;<br />  }<br />  else<br />  {<br />   end = total;<br />   start = each * ( pages - 1 );<br />  }<br />  List gets = new ArrayList();<font color="#000000">//把显示的数据放到一个新的List里</font><br />  for ( int i = start; i &lt; end; i++ )<br />  {<br />   gets.add( list.get( i ) );<br />  }<br />  return gets;<br /> }<br />}<br /><br /></font>
				<font color="#000000">上面的Page Bean比那个就简略的很多，我们再来看看Action怎么来做？<br /><br /></font>
				<font color="#a52a2a">public class AdminAction extends BaseAction<br />{<br /> private AdminManager mgr;</font>
		</p>
		<p>
				<font color="#000000">
						<font color="#a52a2a"> public void setAdminManager( AdminManager mgr )<br /> {<br />  this.mgr = mgr;<br /> }<br /><br />public ActionForward execute( ActionMapping mapping, ActionForm form,<br />   HttpServletRequest request, HttpServletResponse response )<br />   throws Exception<br /> {<br />  Integer pageId = getInt( request, "page" );<br />  Page page = null;<br />  List rs =mgr.getStudents();<br />   if ( rs != null &amp;&amp; rs.size() != 0 )<br />   {<br />    page = new Page( rs, 10 );<br />    request.setAttribute( "students", page.get( pageId ) );<br />   }<br />   request.setAttribute( "search", Select.studentSearch() );<br />  }  <br />  request.setAttribute( "page", page );<br />  return mapping.findForward("student");<br /> }<br /><br />}<br /></font>
						<br />这样我们就可以把分页对象和List放到Execute中了，在这里我们把业务逻辑对象AdminManager的实例mgr声明成了bean的形式，这样可以在Spring中利用ioc来注入：<br /><br />Struts的声明：<br /><br /><font color="#000080">&lt;action path="/admin" type="org.springframework.web.struts.DelegatingActionProxy" /&gt;<br /></font><br />Spring中的声明：<br /><br /></font>
				<font color="#0000ff">&lt;!-- 业务逻辑 --&gt;<br /> &lt;bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />  &lt;property name="transactionManager" ref="transactionManager" /&gt;<br />  &lt;property name="transactionAttributes"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</font>
		</p>
		<p>
				<font color="#0000ff"> &lt;bean id="adminManager" parent="txProxyTemplate"&gt;<br />  &lt;property name="target"&gt;<br />   &lt;bean class="subject.service.impl.AdminManagerImpl"&gt;<br />    &lt;property name="dao" ref="dao" /&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /><br />&lt;bean name="/admin/admin" class="subject.web.action.AdminAction" singleton="false"&gt;<br />  &lt;property name="adminManager"&gt;<br />   &lt;ref bean="adminManager" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /><br /></font>
				<font color="#000000">从而实现了Struts和Spring的完美暇接，singleton="false"从而可以解决单例的诟病！</font>
		</p>
<img src ="http://www.blogjava.net/baputista/aggbug/68687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-09-09 11:24 <a href="http://www.blogjava.net/baputista/archive/2006/09/09/68687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate+Acegi 的初次体验</title><link>http://www.blogjava.net/baputista/archive/2006/08/24/65465.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Thu, 24 Aug 2006 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/08/24/65465.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/65465.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/08/24/65465.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/65465.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/65465.html</trackback:ping><description><![CDATA[
		<p>到现在我也没有弄明白Acegi里面很多的功能,刚刚开始学的时候我就已经被它那繁琐的配置震慑住了，不过当我动起手来一步步实现的时候,才发现其实它远没有那么难,当然随着学习的深入,会渐渐再发现这一点吧,现在就让我们初学者一切体验Acegi的功能吧!<br /><br />还以我传统的例子为例:<br />毕业设计选题系统,三种角色:教师,学生,管理员,我想让他们的登陆都在一个界面下自动识别,而无需进行身份选择,登陆后,他们将分别到各自的admin.jsp,stu.jsp,teacher.jsp<br />在数据库中的表结构如下(很多属性略):<br />id--- user---password--type---about<br /><br />type是用来存储用户的类别,分别有a,t,s分别对应三种角色<br />about对应的是acegi里所需要的enable,用户是否可用</p>
		<p>在model里,我们采用了继承关系:<br /><br />父类user:<br />package subject.model;</p>
		<p>public abstract class User extends BaseObject<br />{<br /> private Integer id;<br /> private String user;<br /> private String password;<br /> private String name;<br /> private String telphone;</p>
		<p>//set and get method <br /> <br /> public abstract String getType(); //这个是用来反映用户角色的关键函数,在子类实现,从而实现多态<br />}<br /><br />子类的实现:<br />======================<br />package subject.model;</p>
		<p>import subject.Constants;</p>
		<p>public class Teacher extends User<br />{<br /> private String level;         //教师的职称<br /><br />//set and get method</p>
		<p> public String getType()<br /> {<br />  return Constants.TEACHER;<br /> }<br />}<br />================<br />package subject.model;</p>
		<p>import subject.Constants;</p>
		<p>public class Student extends User<br />{<br /> private static final long serialVersionUID = 1L;</p>
		<p> private SchoolClass schoolClass;         //学生的班级<br /> private String sn;             //学生的学号</p>
		<p>//set and get method<br /> <br /> public String getType()<br /> {<br />  return Constants.STUDENT;<br /> }<br />}<br />=================<br />package subject.model;</p>
		<p>import subject.Constants;</p>
		<p>public class Admin extends User<br />{<br /> private String grade;           //管理员的级别<br />//set and get method</p>
		<p> public String getType()<br /> {<br />  return Constants.ADMIN;<br /> }<br />}<br /><br />对于三者所共有的属性在数据库里,都存在一个字段,而依据不同的角色拥有不同的含义,学生的班级则存放在了about里,只要学生有班级,他就able,否则就enable了!而管理员和教师则默认为1!<br /><br />这种是属于一个继承树存放在一个表的情况,Hibernate的配置如下:<br />&lt;hibernate-mapping&gt;</p>
		<p> &lt;class name="subject.model.User" discriminator-value="not null"&gt;</p>
		<p>  &lt;id name="id"&gt;<br />   &lt;generator class="increment" /&gt;<br />  &lt;/id&gt;<br />  <br />  &lt;discriminator column="type" type="character" /&gt;<br />  <br />  &lt;property name="user" /&gt;<br />  &lt;property name="password" /&gt;<br />  &lt;property name="name" /&gt;<br />  &lt;property name="telphone" /&gt;</p>
		<p>  &lt;subclass name="subject.model.Admin" discriminator-value="a"&gt;<br />   &lt;property name="grade" column="sn" /&gt;<br />  &lt;/subclass&gt;<br />  <br />  &lt;subclass name="subject.model.Teacher" discriminator-value="t"&gt;<br />   &lt;property name="level" column="sn" /&gt;<br />  &lt;/subclass&gt;<br />  <br />  &lt;subclass name="subject.model.Student" discriminator-value="s"&gt;<br />   <br />   &lt;property name="sn" /&gt;<br />   <br />   &lt;many-to-one name="schoolClass" class="subject.model.SchoolClass" <br />    column="about" update="false" insert="false" /&gt;<br />    <br />  &lt;/subclass&gt;</p>
		<p> &lt;/class&gt;</p>
		<p>&lt;/hibernate-mapping&gt;<br /><br />=============================================<br />上面的这些都是模型的基础,下面再讲怎么样配合Spring和Acegi实现系统的安全与登陆<br />在Spring中Hibernate的配置只介绍不说明:<br />&lt;!-- 定义DBCP数据源 --&gt;<br /> &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />  &lt;property name="driverClassName" value="com.mysql.jdbc.Driver" /&gt;<br />  &lt;property name="url" value="jdbc:mysql://localhost/subject?useUnicode=true&amp;amp;characterEncoding=gbk" /&gt;<br />  &lt;property name="username" value="root" /&gt;<br />  &lt;property name="password" value="" /&gt;<br />  &lt;property name="maxActive" value="100" /&gt;<br />  &lt;property name="maxIdle" value="30" /&gt;<br />  &lt;property name="maxWait" value="1000" /&gt;<br />  &lt;property name="defaultAutoCommit" value="true" /&gt;<br />  &lt;property name="removeAbandoned" value="true" /&gt;<br />  &lt;property name="removeAbandonedTimeout" value="60" /&gt;<br /> &lt;/bean&gt;</p>
		<p> &lt;!-- Hibernate --&gt;<br /> &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />  &lt;property name="dataSource" ref="dataSource" /&gt;<br />  &lt;property name="mappingResources"&gt;<br />   &lt;list&gt;<br />    &lt;value&gt;subject/model/User.hbm.xml&lt;/value&gt;<br />   &lt;/list&gt;<br />  &lt;/property&gt;<br />  &lt;property name="hibernateProperties"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLInnoDBDialect&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</p>
		<p> &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />  &lt;property name="sessionFactory" ref="sessionFactory" /&gt;<br /> &lt;/bean&gt;<br /><br />&lt;!-- Dao对象 --&gt;<br />&lt;bean id="userDao" class="subject.dao.hibernate.UserDaoImpl"&gt;<br />  &lt;property name="sessionFactory" ref="sessionFactory" /&gt;<br /> &lt;/bean&gt;<br /><br />&lt;!-- 业务逻辑 --&gt;<br /> &lt;bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />  &lt;property name="transactionManager" ref="transactionManager" /&gt;<br />  &lt;property name="transactionAttributes"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /><br />&lt;bean id="userManager" parent="txProxyTemplate"&gt;<br />  &lt;property name="target"&gt;<br />   &lt;bean class="subject.service.impl.UserManagerImpl"&gt;<br />    &lt;property name="userDao" ref="userDao" /&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /><br />&lt;!-- Struts --&gt;<br /> &lt;bean name="/user" class="subject.web.action.UserAction" singleton="false"&gt;<br />  &lt;property name="userManager"&gt;<br />   &lt;ref bean="userManager" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br />==================<br />上面具体的不用了解,无非就是调用和数据库的操作,<br />下面就要对Acegi进行声明了:<br />我不用Ctrl+c和Ctrl+V的方式对Acegi进行介绍,没有意义,随便google就一大堆<br />我们想主要在这样的系统中需要的安全策略都有哪些?<br />1.用户的登陆<br />2.防止多个用户登陆一个帐号<br />3.用户的注销<br />4.防止非法用户的访问<br /><br />我这个程序所涉及到的只有这些,下面就进行说明:<br /><br />在web.xml的声明:<br />&lt;!-- Acegi安全控制 Filter 配置 --&gt;<br />    &lt;filter&gt;<br />        &lt;filter-name&gt;securityFilter&lt;/filter-name&gt;<br />        &lt;filter-class&gt;org.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;targetClass&lt;/param-name&gt;<br />            &lt;param-value&gt;org.acegisecurity.util.FilterChainProxy&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />    &lt;/filter&gt;<br />    <br />    &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;securityFilter&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br /><br />Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式，它委托Spring中的Bean -- FilterChainProxy来完成过滤功能，这样就简化了web.xml的配置，并且利用Spring IOC的优势。FilterChainProxy包含了处理认证过程的filter列表，每个filter都有各自的功能。<br /><br />&lt;!-- ======================== FILTER CHAIN ======================= --&gt;<br /> &lt;bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"&gt;<br />  &lt;property name="filterInvocationDefinitionSource"&gt;<br />   &lt;value&gt;<br />    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br />    PATTERN_TYPE_APACHE_ANT<br />    <br />    /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,<br />         securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor<br />   &lt;/value&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /><br />大体上先介绍一下:<br />httpSessionContextIntegrationFilter:每次request前 HttpSessionContextIntegrationFilter从Session中获取Authentication对象，在request完后, 又把Authentication对象保存到Session中供下次request使用,此filter必须其他Acegi filter前使用，使之能跨越多个请求。<br />logoutFilter:用户的注销<br />authenticationProcessingFilter:处理登陆请求<br />exceptionTranslationFilter:异常转换过滤器<br />filterInvocationInterceptor:在访问前进行权限检查<br /><br />这些就犹如在web.xml声明一系列的过滤器,不过当把他们都声明在spring中就可以享受Spring给我们带来的方便了。<br /><br />下面就是对这些过滤器的具体声明：<br />只对有用的地方进行声明，别的地方几乎都是默许的<br />&lt;!-- ======================== FILTER ======================= --&gt;<br /> &lt;bean id="httpSessionContextIntegrationFilter" <br />  class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" /&gt;</p>
		<p> &lt;bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"&gt;<br />  &lt;constructor-arg value="/index.htm" /&gt;             离开后所转向的位置<br />  &lt;constructor-arg&gt;<br />            &lt;list&gt;<br />                &lt;bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/&gt;<br />            &lt;/list&gt;<br />        &lt;/constructor-arg&gt;<br />  &lt;property name="filterProcessesUrl" value="/logout.htm" /&gt;        定义用户注销的地址，<br /> &lt;/bean&gt;<br /><br />下面的这个过滤器，我们根据自己的需求有了自己的实现：</p>
		<p> &lt;bean id="authenticationProcessingFilter" class="subject.web.filter.UserAuthenticationProcessingFilter"&gt;<br />  &lt;property name="authenticationManager" ref="authenticationManager"/&gt;  下面会介绍的用来起到认证管理的作用<br />  &lt;property name="authenticationFailureUrl" value="/login.htm?error=wrong"/&gt;  登陆失败的地址<br />  &lt;property name="defaultTargetUrl" value="/login.htm"/&gt;       登陆成功的地址<br />  &lt;property name="filterProcessesUrl" value="/j_security_check"/&gt;      登陆请求的地址<br />  &lt;property name="userManager" ref="userManager"/&gt;        自己添加的属性，这样就可以访问到我们的业务逻辑<br />  &lt;property name="exceptionMappings"&gt;   出现异常所对应的地址<br />            &lt;value&gt;<br />                org.acegisecurity.AuthenticationException=/login.htm?error=fail     登陆失败                org.acegisecurity.concurrent.ConcurrentLoginException=/login.htm?error=too        已登陆了<br />            &lt;/value&gt;<br />        &lt;/property&gt;<br /> &lt;/bean&gt;<br /> <br /> &lt;bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/&gt;</p>
		<p> &lt;bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"&gt;<br />  &lt;property name="authenticationEntryPoint"&gt;<br />   &lt;bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt;<br />    &lt;property name="loginFormUrl" value="/login.htm?error=please"/&gt;//如果用户没登陆就想访问，先到这里登陆吧<br />    &lt;property name="forceHttps" value="false"/&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /> <br /> &lt;bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt;<br />  &lt;property name="authenticationManager" ref="authenticationManager"/&gt;       认证服务<br />  &lt;property name="accessDecisionManager"&gt;<br />   &lt;bean class="org.acegisecurity.vote.AffirmativeBased"&gt;<br />    &lt;property name="allowIfAllAbstainDecisions" value="false"/&gt;<br />    &lt;property name="decisionVoters"&gt;<br />     &lt;list&gt;<br />      &lt;bean class="org.acegisecurity.vote.RoleVoter"&gt;<br />                    &lt;property name="rolePrefix" value=""/&gt;         //这里定义数据库中存放的角色和我们在这里声明的角色间是否需要加个前缀？我没加<br />                &lt;/bean&gt;<br />     &lt;/list&gt;<br />    &lt;/property&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br />  &lt;property name="objectDefinitionSource"&gt;<br />            &lt;value&gt;<br />                PATTERN_TYPE_APACHE_ANT<br />                <br />                /admin.htm*=a         这里就是数据库中对应的tyep a<br />                /student*=s           由于没有前缀和数据库里一样<br />                /teacher*=t<br />            &lt;/value&gt;<br />        &lt;/property&gt;<br /> &lt;/bean&gt;<br /> <br /> &lt;bean id="loggerListener"<br />          class="org.acegisecurity.event.authentication.LoggerListener"/&gt;       记录事件<br /><br />下面就要说明我们的认证服务了，其起到的关键作用就是用来保证用户登陆身份的验证：<br /><br />它将验证的功能委托给多个Provider，并通过遍历Providers, 以保证获取不同来源的身份认证，若某个Provider能成功确认当前用户的身份，authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象，否则会抛出一个AuthenticationException。<br /><br />先声明一个管理器吧，在上面的过滤器中都已经用到过了<br />&lt;!-- ======================== AUTHENTICATION ======================= --&gt;<br /> &lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"&gt;<br />  &lt;property name="providers"&gt;<br />   &lt;list&gt;<br />    &lt;ref local="daoAuthenticationProvider" /&gt;   我仅仅用到 从数据库中读取用户信息验证身份<br />   &lt;/list&gt;<br />  &lt;/property&gt;<br />  &lt;property name="sessionController"&gt;<br />   &lt;bean id="concurrentSessionController" <br />    class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl"&gt;<br />    &lt;property name="maximumSessions"&gt;<br />     &lt;value&gt;1&lt;/value&gt;每个用户同时登陆一位<br />    &lt;/property&gt;<br />    &lt;property name="sessionRegistry"&gt;<br />     &lt;bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl" /&gt;<br />    &lt;/property&gt;<br />    &lt;property name="exceptionIfMaximumExceeded" value="true" /&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /> 来实现唯一的一个Provider，从数据库验证身份<br /> &lt;bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;<br />  &lt;property name="userDetailsService"&gt;<br />   &lt;bean id="jdbcDaoImpl"<br />            class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"&gt;<br />          &lt;property name="dataSource" ref="dataSource"/&gt;<br />          &lt;property name="usersByUsernameQuery"&gt;<br />              &lt;value&gt;<br />                  select user,password,about from user where user = ?        查找用户的查询语句，只需要把你数据库中的用户和密码以及enable相对应上就行<br />              &lt;/value&gt;<br />          &lt;/property&gt;<br />          &lt;property name="authoritiesByUsernameQuery"&gt;<br />              &lt;value&gt;<br />                  select user,type from user where user = ?           这里就是把用户和权限对应上，在appfuse中用的两个表，我都放一个表里了，所以就用这一个就行问题的关键是要让它能找到两个字段，构成一个对象<br />              &lt;/value&gt;<br />          &lt;/property&gt;<br />      &lt;/bean&gt;<br />  &lt;/property&gt;<br />  &lt;property name="userCache"&gt; 缓存都这么写：<br />   &lt;bean class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"&gt;<br />    &lt;property name="cache"&gt;<br />     &lt;bean class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;<br />      &lt;property name="cacheManager"&gt;<br />       &lt;bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/&gt;<br />      &lt;/property&gt;<br />      &lt;property name="cacheName" value="userCache"/&gt;<br />     &lt;/bean&gt;<br />    &lt;/property&gt;<br />   &lt;/bean&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br /><br />==============<br />对于上面登陆请求的处理器我借鉴了springSide，实现的方法如下：<br />package subject.web.filter;</p>
		<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.http.HttpSession;</p>
		<p>import org.acegisecurity.Authentication;<br />import org.acegisecurity.context.SecurityContext;<br />import org.acegisecurity.context.SecurityContextHolder;<br />import org.acegisecurity.ui.webapp.AuthenticationProcessingFilter;<br />import org.acegisecurity.userdetails.UserDetails;</p>
		<p>import subject.Constants;<br />import subject.model.User;<br />import subject.service.UserManager;</p>
		<p>public class UserAuthenticationProcessingFilter extends<br />  AuthenticationProcessingFilter<br />{<br /> private UserManager userManager;</p>
		<p> public void setUserManager( UserManager userManager )<br /> {<br />  this.userManager = userManager;<br /> }</p>
		<p> protected boolean requiresAuthentication( HttpServletRequest request ,<br />   HttpServletResponse response )<br /> {<br />  boolean requiresAuth = super.requiresAuthentication( request, response );<br />  HttpSession httpSession = null;<br />  try<br />  {<br />   httpSession = request.getSession( false );<br />  }<br />  catch ( IllegalStateException ignored )<br />  {<br />  }<br />  if ( httpSession != null )<br />  {<br />   if ( httpSession.getAttribute( Constants.USER ) == null )<br />   {<br />    if ( !requiresAuth )<br />    {<br />     SecurityContext sc = SecurityContextHolder.getContext();<br />     Authentication auth = sc.getAuthentication();<br />     if ( auth != null<br />       &amp;&amp; auth.getPrincipal() instanceof UserDetails )<br />     {<br />      UserDetails ud = (UserDetails) auth.getPrincipal();//上面声明的sql无非就是要包装成这个对象<br />      User user = userManager.getUser( ud.getUsername() );从业务逻辑里找到用户，放到session里<br />      httpSession.setAttribute( Constants.USER, user );<br />     }<br />    }<br />   }<br />  }<br />  return requiresAuth;<br /> }<br />}<br /><br />在看看我的login.htm在登陆成功时是怎么工作的吧？<br />public class UserAction extends BaseAction<br />{<br /> private UserManager mgr;</p>
		<p> public void setUserManager( UserManager mgr )<br /> {<br />  this.mgr = mgr;<br /> }</p>
		<p> public ActionForward login( ActionMapping mapping , ActionForm form ,<br />   HttpServletRequest request , HttpServletResponse response )<br />   throws Exception<br /> {<br />  User user = (User) getSessionObject( request, Constants.USER );<br />  ActionMessages msg = new ActionMessages();<br />  if ( user != null )<br />  {<br />   return new ActionForward(  user.getType() + ".htm", true );成功就去type.htm<br />  }<br />  else<br />  {<br />   String error = getParameter( request, Constants.ERROR );<br />   if ( error != null )对于不同的错误，都加以提示<br />   {<br />    if ( error.equalsIgnoreCase( "wrong" ) )<br />     msg.add( "msg", new ActionMessage( "fail.login.wrong" ) );<br />    else if ( error.equalsIgnoreCase( "too" ) )<br />     msg.add( "msg", new ActionMessage( "fail.login.too" ) );<br />    else if ( error.equalsIgnoreCase( "fail" ) )<br />     msg.add( "msg", new ActionMessage( "fail.login.fail" ) );<br />    else<br />     msg.add( "msg", new ActionMessage( "fail.login.please" ) );<br />   }<br />   else<br />    msg.add( "msg", new ActionMessage( "fail.login.please" ) );<br />  }<br />  saveErrors( request, msg );<br />  return mapping.findForward( "fail" );<br /> }</p>
		<p>}<br /><br />当然，Acegi需要介绍的东西太多了，我只把我这次认为有必要解释的东西写在了上面让大家来参考，作为能google到的东西，比如对于认证的方式还有很多，我就没有详细的介绍，在学习Acegi过程中，把它自带的例子弄清楚很关键，希望大家一起学习一起共勉！<br /><br /></p>
<img src ="http://www.blogjava.net/baputista/aggbug/65465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-08-24 10:56 <a href="http://www.blogjava.net/baputista/archive/2006/08/24/65465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Applet实现表达式求值</title><link>http://www.blogjava.net/baputista/archive/2006/08/09/62558.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Wed, 09 Aug 2006 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/08/09/62558.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/62558.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/08/09/62558.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/62558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/62558.html</trackback:ping><description><![CDATA[
		<p>少了浏览器的支持，Applet在互联网上永远不会有自己的舞台，而我却很酷爱这种把应用程序放到界面里的东东，今天无聊，把以前写过的一个表达式求值的程序，顺手拿Applet改写一下，再让大家体验一下MVC设计模式的应用吧：<br /><br /><br />=======================ExpressionModel===================<br /><br />/*<br /> *这个就是表达式的模型组件了，它的三个属性，分别代表了它的中则表达式和右则表达式<br /> *而那两个属性分别是输入的式子和得到的结果<br /> */<br />package expression;</p>
		<p>import java.text.*;<br />import java.util.*;</p>
		<p>public class ExpressionModel extends Observable<br />{<br /> <br /> private ArrayList&lt;String&gt; middle;<br /> private ArrayList&lt;String&gt; right;<br /> private String input, result;</p>
		<p> public ExpressionModel()<br /> {<br />  middle = new ArrayList&lt;String&gt;();<br />  right = new ArrayList&lt;String&gt;();<br /> }<br /><br /> //判断一个字符是不是操作符<br /> private boolean isOperator( String op )<br /> {<br />  if( op.equals("+") || op.equals("-") || op.equals("%")<br />     ||op.equals("*")|| op.equals("/") || op.equals("(")<br />     ||op.equals(")") )<br />    return true;<br />    <br />  else return false;<br /> }<br /><br /> //得到一个操作符的优先级<br /> private int priority( String op )<br /> {<br />  if( op.equals("+") || op.equals("-") || op.equals("(") ) <br />   return 1;<br />  else if( op.equals("*") || op.equals("/") || op.equals("%") ) <br />   return 2;<br />  else <br />   return 0;<br /> }<br /> <br /><br />//计算两个数和一个运算符得到的结果<br /> private String calTwoNumber( String op, String a, String b ) throws Exception<br /> {<br />  double x = Double.parseDouble( b );<br />  double y = Double.parseDouble( a );<br />  double z = 0;<br />  <br />  if( op.equals("+") ) <br />   z = x + y;<br />  else if( op.equals("-") ) <br />   z = x - y;<br />  else if( op.equals("*") ) <br />   z = x * y;<br />  else if( op.equals("/") ) <br />   z = x / y;<br />  else if( op.equals("%") ) <br />   z = x % y;<br />  else <br />   z=0;<br />  <br />  return Double.toString( z );<br /> }<br /> <br />//将我们输入的中则表达式转换成逆波兰式<br /> private void turnToRight()<br /> {<br />  MyStack stack = new MyStack();<br />  String op;<br />  int pos = 0;<br />  <br />  StringTokenizer st = new StringTokenizer(input,"+-*/%()",true);<br />  <br />  while( st.hasMoreElements() )<br />   middle.add( st.nextToken() );<br />  <br />  while(true)<br />  {<br />   if( isOperator( middle.get(pos) ) )<br />   {<br />    if( stack.getTop() == -1 || (middle.get(pos)).equals("(") )<br />    {<br />     stack.push( middle.get(pos) );<br />    }<br />    else<br />    {<br />     if( (middle.get(pos)).equals(")") )<br />     {<br />      if( !(stack.top()).equals("(") )<br />      {<br />       op = stack.pop();<br />       right.add(op);<br />      }<br />     }<br />     else<br />     {<br />      if( priority(middle.get(pos)) &lt;= priority(stack.top()) &amp;&amp; stack.getTop() != -1 )<br />      {<br />       op = stack.pop();<br />       if( !op.equals("(") ) <br />        right.add(op);<br />      }<br />      stack.push( middle.get(pos) );<br />     }<br />    }<br />   }<br />   else <br />    right.add( middle.get(pos) );<br />   pos++;<br />   if( pos &gt;= middle.size() ) <br />    break;<br />  }<br />  <br />  while( stack.getTop() != -1 )<br />  {<br />   op = stack.pop();<br />   right.add(op);<br />  }<br /> }</p>
		<p> private void calculate( String expression ) throws Exception<br /> {<br />  input = expression;<br />  <br />  turnToRight();<br />  <br />  MyStack stack = new MyStack();<br />  String op1, op2, is = null;<br />  Iterator&lt;String&gt; it = right.iterator();<br />  <br />  while(it.hasNext())<br />  {<br />   is = it.next();<br />   if( isOperator(is) )<br />   {<br />    op1 = stack.pop();<br />    op2 = stack.pop();<br />    stack.push( calTwoNumber(is,op1,op2) );<br />   }<br />   else stack.push(is);<br />  }<br />  <br />  NumberFormat form = NumberFormat.getInstance();<br />  form.setMaximumFractionDigits(5);<br />  <br />  result = input + "=" + form.format( Double.parseDouble( stack.pop() ) );<br />  <br />  setChanged();<br />  notifyObservers();<br /> }<br /> <br /> public void input(String expression) throws Exception<br /> {<br />  calculate(expression);<br />  middle.clear();<br />  right.clear();<br /> }<br /> <br /> public String getResult(){<br />  return result;<br /> }<br /> <br />}<br /><br /><br /><br />===============MyStack==============<br /><br /><br />//我们用到的自己的堆栈<br />package expression;</p>
		<p>import java.util.*;</p>
		<p>public class MyStack<br />{<br /> <br /> private LinkedList&lt;String&gt; list;<br /> private int top;<br /> <br /> public MyStack() <br /> {<br />  list = new LinkedList&lt;String&gt;();<br />  top = -1;<br /> }<br />  <br /> public void push(String value)<br /> {<br />  top++;<br />  list.addFirst(value);<br /> }<br /> <br /> public String pop()<br /> {<br />  String temp = list.getFirst();<br />  top--;<br />  list.removeFirst();<br />  return temp;<br /> }<br /> <br /> public String top()<br /> {<br />  return list.getFirst();<br /> }<br /> <br /> public int getTop()<br /> {<br />  return top;<br /> }<br /> <br />}<br /><br />===============ExpressionController========------<br /><br />//控制器组件，包括一个输入域和两个按纽<br /><br />package expression;</p>
		<p>import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;</p>
		<p>public class ExpressionController extends JPanel <br />{<br /> <br /> private ExpressionModel expressionModel;   <br /> private JTextField calTextField;<br /> <br /> public ExpressionController( ExpressionModel controllerModel ) {<br />  <br />  super();<br />  <br />  expressionModel = controllerModel;<br />  <br />  calTextField = new JTextField( 15 );<br />  JButton calButton = new JButton( "计算" );<br />  JButton delButton = new JButton( "取消" );<br />  <br />  calButton.addActionListener(<br />   new ActionListener() <br />   {<br />    public void actionPerformed( ActionEvent event ) <br />    {<br />     try <br />     {<br />      expressionModel.input( calTextField.getText() );<br />      calTextField.setText("");<br />     }<br />     catch ( Exception exception ) <br />     {<br />      JOptionPane.showMessageDialog ( <br />       ExpressionController.this, <br />       "请输入有效表达式！", "错误", <br />       JOptionPane.ERROR_MESSAGE );<br />      calTextField.setText("");<br />     }<br />    }<br />   }<br />  );<br />  <br />  delButton.addActionListener(<br />   new ActionListener() <br />   {<br />    public void actionPerformed( ActionEvent event ) <br />    {<br />     try <br />     {<br />      calTextField.setText("");<br />     }<br />     catch ( Exception exception ) <br />     {<br />      calTextField.setText("");<br />     }<br />    }<br />   }<br />  );<br />  <br />  setLayout( new FlowLayout() );<br />  <br />  add( calTextField );<br />  add( calButton );<br />  add( delButton );<br /> <br /> }<br /> <br /> public Dimension getPreferredSize() <br /> {<br />  return new Dimension( 320, 40 );<br /> }<br /> <br /> public Dimension getMinimumSize() <br /> {<br />  return getPreferredSize();<br /> }<br /> <br /> public Dimension getMaximumSize() <br /> {<br />  return getPreferredSize();<br /> }<br /> <br />}<br /><br /><br /><br />================ExpressionView ==================<br />//用来显示结果的视图<br />package expression;</p>
		<p>import java.awt.*;<br />import java.text.*;<br />import java.util.*;</p>
		<p>import javax.swing.*;<br />import javax.swing.border.*;</p>
		<p>public class ExpressionView extends JPanel implements Observer <br />{<br /> <br /> private ExpressionModel expressionModel;<br /> private JLabel display = new JLabel();<br /> <br /> public ExpressionView( ExpressionModel model ) {<br />  <br />  if( model == null ) <br />   throw new NullPointerException();<br />  <br />  expressionModel = model;<br />  expressionModel.addObserver( this );<br />  <br />  add( display );<br />  <br />  setBackground( Color.white );<br />  setBorder( new MatteBorder( 1, 1, 1, 1, Color.black ) );<br />  <br /> }<br /> <br /> public void update( Observable observable, Object object ) <br /> {<br />  display.setText( expressionModel.getResult() );<br /> }<br /> <br /> public Dimension getPreferredSize() <br /> {<br />  return new Dimension( 320, 60 );<br /> }<br /> <br /> public Dimension getMinimumSize() <br /> {<br />  return getPreferredSize();<br /> }<br /> <br /> public Dimension getMaximumSize() <br /> {<br />  return getPreferredSize();<br /> }<br /> <br /> <br />}<br /><br /><br /><br />===================Expression=====================<br /><br />//最后把这些组装到这里吧<br /><br />package expression;</p>
		<p>import java.awt.*;<br />import java.awt.event.*;</p>
		<p>import javax.swing.*;<br />import javax.swing.border.*;</p>
		<p>public class Expression extends JApplet <br />{<br />   <br /> public void init() <br /> {<br />  ExpressionModel model = new ExpressionModel();<br />  ExpressionView view = new ExpressionView( model );<br />  ExpressionController controller = new ExpressionController( model );<br />  <br />  Container contentPane = getContentPane();<br />  contentPane.add( view, BorderLayout.CENTER );<br />  contentPane.add( controller, BorderLayout.SOUTH );<br />  <br />  setSize( 320, 100 );<br />  <br /> }<br />   <br />}<br /><br />把这几个类打包到一个jar文件后，再创建个htm文件来访问它<br /><br />&lt;object<br />    classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"<br />    codebase = "<a href="http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,5">http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,5</a>"<br />    WIDTH = 320 HEIGHT = 100 &gt;<br />    &lt;PARAM NAME = CODE VALUE = "expression.Expression" &gt;<br />    &lt;PARAM NAME = ARCHIVE VALUE = "expression.jar" &gt;<br />    &lt;param name = "type" value = "application/x-java-applet;version=1.5"&gt;<br />    &lt;param name = "scriptable" value = "false"&gt;<br />&lt;/object&gt;<br /><br />这样就行了，不过你的机器需要安装jre 5<br /><br /></p>
<img src ="http://www.blogjava.net/baputista/aggbug/62558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-08-09 14:19 <a href="http://www.blogjava.net/baputista/archive/2006/08/09/62558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>urlRewriteFilter来实现url的美化</title><link>http://www.blogjava.net/baputista/archive/2006/08/04/61850.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Fri, 04 Aug 2006 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/08/04/61850.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/61850.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/08/04/61850.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/61850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/61850.html</trackback:ping><description><![CDATA[
		<p>在appfuse的web.xml声明文件中有下面的类似声明：<br /><br />&lt;filter&gt;<br />        &lt;filter-name&gt;rewriteFilter&lt;/filter-name&gt;<br />        &lt;filter-class&gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&lt;/filter-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;logLevel&lt;/param-name&gt;<br />            &lt;param-value&gt;commons&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />    &lt;/filter&gt;</p>
		<p> &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;rewriteFilter&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br /><br /><br />它所应用到的包存放在lib下的urlrewrite-3.0-beta.jar<br /><br />它和以上的两部分，以及/web-inf/urlrewrite.xml构成了对url地址的美化<br /><br />打开这个文件，我们可以看到以下的声明：<br /><br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"<br />    "<a href="http://tuckey.org/res/dtds/urlrewrite3.0.dtd">http://tuckey.org/res/dtds/urlrewrite3.0.dtd</a>"&gt;</p>
		<p>&lt;!-- <a href="https://urlrewrite.dev.java.net/manual/3.0">https://urlrewrite.dev.java.net/manual/3.0</a> --&gt;<br />&lt;urlrewrite&gt;<br />    &lt;rule&gt;<br />        &lt;from&gt;^/user/(.*).html$&lt;/from&gt;<br />        &lt;to type="forward"&gt;/editUser.html\?username=$1&lt;/to&gt;<br />    &lt;/rule&gt;<br />&lt;/urlrewrite&gt;<br /><br />这样系统就完成了url地址的editUser.html?username=****的美化<br /><br />如将 <br />http://localhost/aaa/bbb.<a href="http://www.iyit.net/Html/bckf/jsp/index.html" target="_blank"><font color="#000000">jsp</font></a>?id=99&amp;name=abc <br />表现为： <br />http://localhost/aaa/bbb/99_abc.html <br />配置如下： <br />&lt;rule&gt; <br />&lt;from&gt;/aaa/bbb/([0-9]+)_([a-z]+).html&lt;/from&gt; <br />&lt;to&gt;/../aaa/bbb.<a href="http://www.iyit.net/Html/bckf/jsp/index.html" target="_blank"><font color="#000000">jsp</font></a>?id=$1&amp;name=$2&lt;/to&gt; <br />&lt;/rule&gt; <br /></p>
<img src ="http://www.blogjava.net/baputista/aggbug/61850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-08-04 20:36 <a href="http://www.blogjava.net/baputista/archive/2006/08/04/61850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Spring中配置log4j</title><link>http://www.blogjava.net/baputista/archive/2006/08/04/61614.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Thu, 03 Aug 2006 16:31:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/08/04/61614.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/61614.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/08/04/61614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/61614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/61614.html</trackback:ping><description><![CDATA[首先需要在web.xml进行声明：<br /><br />&lt;!--如果不定义webAppRootKey参数，那么webAppRootKey就是缺省的"webapp.root"--&gt;<br /> &lt;context-param&gt;<br />  &lt;param-name&gt;webAppRootKey&lt;/param-name&gt;<br />  &lt;param-value&gt;ssh.root&lt;/param-value&gt;<br /> &lt;/context-param&gt;<br /><br />这里的ssh是http://localhost:8080/ssh/<br /><br />而root是系统开发目录中ssh/root<br /><br />这样配置文件以及日志文件可以在spring的帮助下，放到开发环境中的任意位置<br /><br />&lt;!--由Sprng载入的Log4j配置文件位置--&gt;<br /> &lt;context-param&gt;<br />  &lt;param-name&gt;log4jConfigLocation&lt;/param-name&gt;<br />  &lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt;<br /> &lt;/context-param&gt;<br /><br />在这里定位配置文件，需要的是从root开始的绝对路径<br /><br />&lt;!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond--&gt;<br /> &lt;context-param&gt;<br />  &lt;param-name&gt;log4jRefreshInterval&lt;/param-name&gt;<br />  &lt;param-value&gt;60000&lt;/param-value&gt;<br /> &lt;/context-param&gt;<br /><br />&lt;!--Spring log4j Config loader--&gt;<br /> &lt;listener&gt;<br />  &lt;listener-class&gt;org.springframework.web.util.Log4jConfigListener&lt;/listener-class&gt;<br /> &lt;/listener&gt;<br /><br />设置监听器<br /><br /><br /><br />/////////////////<br />之后我们就可以配置log4j配置文件了<br /><br />#先设置级别<br />log4j.rootCategory=INFO, file<br />log4j.appender.file=org.apache.log4j.RollingFileAppender<br />#在这里设置日志需要存放的位置，这里的变量就是我们在web.xml里设置的<br />log4j.appender.file.File=${ssh.root}/WEB-INF/logs/subject.log<br />log4j.appender.file.MaxFileSize=100KB<br />log4j.appender.file.MaxBackupIndex=0<br />log4j.appender.file.layout=org.apache.log4j.SimpleLayout<br />log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n<br /><br />有了上面的配置，我们就可以查看日志了！<img src ="http://www.blogjava.net/baputista/aggbug/61614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-08-04 00:31 <a href="http://www.blogjava.net/baputista/archive/2006/08/04/61614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML扫盲普及！</title><link>http://www.blogjava.net/baputista/archive/2006/06/26/55215.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Mon, 26 Jun 2006 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/06/26/55215.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/55215.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/06/26/55215.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/55215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/55215.html</trackback:ping><description><![CDATA[
		<img height="849" alt="未命名-1.jpg" src="http://www.blogjava.net/images/blogjava_net/baputista/未命名-1.jpg" width="756" border="0" />
		<br />
		<br />现在我向大家进行uml扫盲性普及，如果您还不知道uml是什么，那么最简单的，类似上面的这样的图就是uml图，大家记住了，别跟辽宁石油化工大学的张国玉这个老师似的，说我论文里的这个图是电路图，因此说我的毕业设计不合格！<img src ="http://www.blogjava.net/baputista/aggbug/55215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-06-26 20:47 <a href="http://www.blogjava.net/baputista/archive/2006/06/26/55215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验Struts(6)---阻止非法的登陆方式</title><link>http://www.blogjava.net/baputista/archive/2006/05/26/48248.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Thu, 25 May 2006 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/05/26/48248.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/48248.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/05/26/48248.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/48248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/48248.html</trackback:ping><description><![CDATA[
		<p>如果用户直接输入了地址，不也可以直接访问吗？理论上是，我们可以加入session进行跟踪，以杜绝此类型事件发生，我们是不是要把每次对session的判断依次拷到每个页里呢，之后下次需要验证的SESSION换了，我们再换？太浪费了，我的做法是做了一个自定义标签，来解决这个问题。<br /><br /><font color="#ff0000">import javax.servlet.jsp.JspException;<br />import javax.servlet.jsp.tagext.TagSupport;</font></p>
		<p>
				<font color="#ff0000">public class CheckTag extends TagSupport<br />{<br />    private static final long serialVersionUID = 879137944441282895L;<br />    private String check = "";<font color="#000000">//用来验证的变量</font><br />    private String url = "index.jsp";<font color="#000000">//出现错误要去的页面</font><br />    private String msg = "";<font color="#000000">//错误的提示</font><br />    private String scope = "";<font color="#000000">//要严整变量的范围</font><br />    private String to = "go";</font>
				<font color="#000000">//如果验证失败，是将页面后退，还是定位到哪里？</font>
		</p>
		<p>
				<font color="#ff0000">    public String getTo()<br />    {<br />        return to;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setTo( String to )<br />    {<br />        this.to = to;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getMsg()<br />    {<br />        return msg;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setMsg( String msg )<br />    {<br />        this.msg = msg;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getScope()<br />    {<br />        return scope;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setScope( String scope )<br />    {<br />        this.scope = scope;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getCheck()<br />    {<br />        return check;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setCheck( String check )<br />    {<br />        this.check = check;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getUrl()<br />    {<br />        return url;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setUrl( String url )<br />    {<br />        this.url = url;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int doStsrtTag() throws JspException<br />    {<br />        return SKIP_BODY;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int doEndTag() throws JspException<br />    {<br />        boolean valid = false;<font color="#000000">//先设为不可用</font><br />        if ( scope.equalsIgnoreCase( "request" ) )<font color="#000000">//如果要检查request范围</font><br />        {<br />            valid = CheckUtil.checkRequestAttribute( pageContext.getRequest(),<br />                    check );<br />        }<br />        else if ( scope.equalsIgnoreCase( "session" ) )<br />        {<br />            valid = CheckUtil.checkSession( pageContext.getSession(), check );<br />        }<br />        else if ( scope.equalsIgnoreCase( "parameter" ) )<br />        {<br />            valid = CheckUtil.checkParameter( pageContext.getRequest(), check );<br />        }<br />        else if ( scope.equalsIgnoreCase( "application" ) )<br />        {<br />            valid = CheckUtil.checkApp( pageContext.getServletContext(), check );<br />        }<br />        if ( valid ) return EVAL_PAGE;<font color="#000000">//如果可用就继续执行此页的其余部分</font><br />        else<br />        {<font color="#000000">//否则，哈哈</font><br />            try<br />            {<br />                if ( to.equalsIgnoreCase( "go" ) ) <font color="#000000">//现在失败了，就看怎么回到你该到的地方</font><br />                    HtmlUtil.callParentGo(<br />                        pageContext.getOut(), msg, url );<font color="#000000">//将浏览器定位到URL </font><br />                else<br />                    HtmlUtil.callBack( pageContext.getOut(), msg );<font color="#000000">//后退一下页面来阻止</font><br />                return SKIP_PAGE;<font color="#000000">//跳过页面的其余部分，不执行</font><br />            }<br />            catch ( Exception e )<br />            {<br />                throw new JspException( e.toString() );<br />            }<br />        }<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void release()<br />    {<br />        super.release();<br />        check = "";<br />        url = "";<br />        msg = "";<br />        scope = "";<br />    }<br />}<br /><br /><br />下面是用到的htmlUtil部分：<br /><br />public static void callParentGo( Writer out, String msg, String url )<br />            throws IOException<br />    {<br />        out.write( "&lt;script language=\"javascript\"&gt;" );<br />        out.write( "alert(\"" + msg + "\");" );<br />        out.write( "parent.location.href=\"" + url + "\";" );<br />        out.write( "&lt;/script&gt;" );<br />    }<br />public static void callBack( Writer out, String msg ) throws IOException<br />    {<br />        out.write( "&lt;script language=\"javascript\"&gt;" );<br />        out.write( "alert(\"" + msg + "\");" );<br />        out.write( "parent.history.back();" );<br />        out.write( "&lt;/script&gt;" );<br />    }<br /><br /><br />写个check.tld部署吧，<br /><br />&lt;?xml version = "1.0"?&gt;<br />&lt;taglib&gt;<br /> &lt;tlibversion&gt;1.0&lt;/tlibversion&gt;<br /> &lt;jspversion&gt;1.1&lt;/jspversion&gt;<br /> &lt;tag&gt;<br />  &lt;name&gt;check&lt;/name&gt;<br />  &lt;tag-class&gt;com.boya.subject.util.CheckTag&lt;/tag-class&gt;<br />  &lt;attribute&gt;<br />   &lt;name&gt;check&lt;/name&gt;<br />   &lt;required&gt;true&lt;/required&gt;<br />  &lt;/attribute&gt;<br />  &lt;attribute&gt;<br />   &lt;name&gt;url&lt;/name&gt;<br />   &lt;required&gt;false&lt;/required&gt;<br />  &lt;/attribute&gt;<br />  &lt;attribute&gt;<br />   &lt;name&gt;msg&lt;/name&gt;<br />   &lt;required&gt;true&lt;/required&gt;<br />  &lt;/attribute&gt;<br />  &lt;attribute&gt;<br />   &lt;name&gt;scope&lt;/name&gt;<br />   &lt;required&gt;true&lt;/required&gt;<br />  &lt;/attribute&gt;<br />  &lt;attribute&gt;<br />   &lt;name&gt;to&lt;/name&gt;<br />   &lt;required&gt;false&lt;/required&gt;<br />  &lt;/attribute&gt;<br /> &lt;/tag&gt;<br />&lt;/taglib&gt;<br /><br /><br />你</font>
				<font color="#000000">只要在每个页面里写下这个就可以判定用户是否登陆了<br /><br />&lt;%@ taglib prefix="boya" uri="/WEB-INF/check.tld" %&gt;<br />&lt;boya:check check="admin" msg="管理员尚未登陆，请登陆！" scope ="session"/&gt;<br /><br />如果没有登陆那么，会自动提示到首页登陆，不错，很完美吧？<br /><br />当然不是，您可以提出您的见解。。。。</font>
		</p>
<img src ="http://www.blogjava.net/baputista/aggbug/48248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-05-26 00:48 <a href="http://www.blogjava.net/baputista/archive/2006/05/26/48248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验Struts(5)---从分页体会MVC</title><link>http://www.blogjava.net/baputista/archive/2006/05/26/48246.html</link><dc:creator>誰伴我闖蕩</dc:creator><author>誰伴我闖蕩</author><pubDate>Thu, 25 May 2006 16:29:00 GMT</pubDate><guid>http://www.blogjava.net/baputista/archive/2006/05/26/48246.html</guid><wfw:comment>http://www.blogjava.net/baputista/comments/48246.html</wfw:comment><comments>http://www.blogjava.net/baputista/archive/2006/05/26/48246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baputista/comments/commentRss/48246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baputista/services/trackbacks/48246.html</trackback:ping><description><![CDATA[
		<p>大家都知道Struts是一种基于MVC的结构，而这个MVC又怎么样理解呢？书上阐述的一般都很详细，而我的理解很直白，我们可以把业务逻辑放到每个JSP页面中，当你访问一个JSP页面的时候，就可以看到业务逻辑得到的结果，而把这些业务逻辑与HTML代码夹杂到了一起，一定会造成一些不必要的麻烦，可以不可以不让我们的业务逻辑和那些HTML代码夹杂到一起呢？多少得搀杂一些，那干脆，尽量少的吧，于是我们可以尝试着把业务逻辑的运算过程放到一个Action里，我们访问这个Action，之后Action执行业务逻辑，最后把业务逻辑的结果放到request中，并将页面请求转发给一个用于显示结果的jsp页面，这样，这个页面就可以少去很多的业务逻辑，而只是单纯的去显示一些业务逻辑计算结果的页面而已。这时的Action称为控制器，JSP页可以叫做视图了，而控制器操作的业务对象，无非就应该叫模型了！<br /><br />从上面的话，我们来分析一下当我们要做一个分页时所需要的部分，而在这之前，我们先看看他们的执行过程吧，首先我们第一次请求访问一个页面，它会把所有记录的前N条显示给我们，之后计算是否有下一页，等类似的信息，当我们点下一页的时候，就获取下一页的信息，我们还可以添加一个搜索，比如我们用于显示学生的，可以安学生姓名查找，学号查找，班级查找。而对于显示的对象，我们一般也都会封装为javabean，所以用于放置查询结果的容器是不定的，而这时，我们就需要用泛型来提升我们的代码效率！<br /><br />首先我们写一个用于分页显示的javabean：<br /><br /><font color="#ff0000">package com.boya.subject.model;</font></p>
		<p>
				<font color="#ff0000">import java.util.Vector;</font>
		</p>
		<p>
				<font color="#ff0000">public class Page&lt;E&gt;<br />{<br />    private int current = 1;       <font color="#000000"> //</font><font color="#000000">当前页<br /></font>    private int total = 0;        <font color="#000000"> //总记录数<br /></font>    private int pages = 0;   <font color="#000000"> //总页数</font><br />    private int each = 5;        <font color="#000000"> //每页显示</font><br />    private int start = 0;     <font color="#000000"> //每页显示的开始记录数</font><br />    private int end = 0;      <font color="#000000"> //每页显示的结束记录数</font><br />    private boolean next = false;       <font color="#000000"> //是否有下一页</font><br />    private boolean previous = false; <font color="#000000"> //是否有上一页</font><br />    private Vector&lt;E&gt; v = null;   </font>
				<font color="#000000">//存放查询结果的容器</font>
		</p>
		<p>
				<font color="#ff0000">    public Page( Vector&lt;E&gt; v ,int per)<br />    {<br />        this.v = v;<br />        each = per;<br />        total = v.size();  <font color="#000000"> //容器的大小就是总的记录数</font><br />        if ( total % each == 0 ) <br />            pages = total / each;      <font color="#000000"> //计算总页数</font><br />        else<br />            pages = total / each + 1;<br />        if ( current &gt;= pages )<br />        {<br />            next = false;<br />        }<br />        else<br />        {<br />            next = true;<br />        }<br />        if ( total &lt; each )<br />        {<br />            start = 0;<br />            end = total;<br />        }<br />        else<br />        {<br />            start = 0;<br />            end = each;<br />        }<br />    }<br />    <br />    public int getCurrent()<br />    {<br />        return current;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setCurrent( int current )<br />    {<br />        this.current = current;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int getEach()<br />    {<br />        return each;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setEach( int each )<br />    {<br />        this.each = each;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public boolean isNext()<br />    {<br />        return next;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setNext( boolean next )<br />    {<br />        this.next = next;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public boolean isPrevious()<br />    {<br />        return previous;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setPrevious( boolean previous )<br />    {<br />        this.previous = previous;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int getEnd()<br />    {<br />        return end;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int getPages()<br />    {<br />        return pages;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int getStart()<br />    {<br />        return start;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public int getTotal()<br />    {<br />        return total;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">
						<font color="#000000"> //获取下一页的对象们</font>   <br /><br />public Vector&lt;E&gt; getNextPage()<br />    {<br />        current = current + 1;<br />        if ( (current - 1) &gt; 0 )<br />        {<br />            previous = true;<br />        }<br />        else<br />        {<br />            previous = false;<br />        }<br />        if ( current &gt;= pages )<br />        {<br />            next = false;<br />        }<br />        else<br />        {<br />            next = true;<br />        }<br />        Vector&lt;E&gt; os = gets();<br />        return os;<br />    }<br /><br /></font>
				<font color="#000000"> //获取上一页</font>
		</p>
		<p>
				<font color="#ff0000">    public Vector&lt;E&gt; getPreviouspage()<br />    {<br />        current = current - 1;<br />        if ( current == 0 )<br />        {<br />            current = 1;<br />        }<br />        if ( current &gt;= pages )<br />        {<br />            next = false;<br />        }<br />        else<br />        {<br />            next = true;<br />        }<br />        if ( (current - 1) &gt; 0 )<br />        {<br />            previous = true;<br />        }<br />        else<br />        {<br />            previous = false;<br />        }<br />        Vector&lt;E&gt; os = gets();<br />        return os;<br />    }<br /><br /></font>
				<font color="#000000"> //一开始获取的</font>
		</p>
		<p>
				<font color="#ff0000">    public Vector&lt;E&gt; gets()<br />    {<br />        if ( current * each &lt; total )<br />        {<br />            end = current * each;<br />            start = end - each;<br />        }<br />        else<br />        {<br />            end = total;<br />            start = each * (pages - 1);<br />        }<br />        Vector&lt;E&gt; gets = new Vector&lt;E&gt;();<br />        for ( int i = start; i &lt; end; i++ )<br />        {<br />            E o = v.get( i );<br />            gets.add( o );<br />        }<br />        return gets;<br />    }<br />}<br /><br /><br /><br /></font>
				<font color="#000000"> 而对于按不同搜索，我们需要一个FormBean，一般的搜索，都是模糊搜索，搜索个大概，而且输入的信息中文的比重也会很大，所以，我把对中文字符的转换放到了这个BEAN里，在进行select * from * where like这样的查询时，如果是like ''这样就可以得到所有的记录了，我便用这个来对付没有输入查询关键字的情况，而like '%*%'可以匹配关键字，而%%也在这里添加上了！<br /><br /></font>
				<font color="#ff0000">package com.boya.subject.view;</font>
		</p>
		<p>
				<font color="#ff0000">import java.io.UnsupportedEncodingException;<br />import javax.servlet.http.HttpServletRequest;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionMapping;</font>
		</p>
		<p>
				<font color="#ff0000">public class SearchForm extends ActionForm<br />{<br />    private static final long serialVersionUID = 1L;<br />    private String key;<br />    private String from;</font>
		</p>
		<p>
				<font color="#ff0000">    public String getFrom()<br />    {<br />        return from;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setFrom( String from )<br />    {<br />        this.from = from;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">   </font>
				<font color="#ff0000">  public void reset( ActionMapping mapping, HttpServletRequest req )<br />    {<br />        this.key = null;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getKey()<br />    {<br />        return key;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setKey( String key )<br />    {<br />        try<br />        {<br />            key = new String( key.getBytes( "iso-8859-1" ), "gb2312" );<br />        }<br />        catch ( UnsupportedEncodingException e )<br />        {<br />            e.printStackTrace();<br />        }<br />        this.key = "%" + key + "%";<br />    }<br />    <br />    public String getAny(){<br />        return "%%";<br />    }<br />}<br /><font color="#000000">前期都做好了，我现在就要开始访问这个Action了，可是这个控制器还没写呢！这里是代码</font></font>
		</p>
		<p>
				<font color="#ff0000">
						<font color="#000000">
						</font>public class AdminUserAction extends AdminAction<br />{<br />    private Vector&lt;Student&gt; ss; <font color="#000000">//用来装结果的容器</font><br />    private Page&lt;Student&gt; ps;</font>
				<font color="#000000">//分页显示的PAGE对象</font>
		</p>
		<p>
				<font color="#ff0000">    protected ActionForward executeAction( ActionMapping mapping,<br />            ActionForm form, HttpServletRequest req, HttpServletResponse res )<br />            throws Exception<br />    {<br />        if ( !isSupper( req ) )<br />        {<br />            return notSupper( res );<font color="#000000">//如果不是超级管理员怎么办？</font><br />        }<br />        Service service = getService();<font color="#000000">//获取业务逻辑</font><br />        SearchForm sf = (SearchForm) form;<font color="#000000">//获取搜索FORM</font><br />        String op = req.getParameter( "op" );<font color="#000000">//获取用户对页面的操作</font><br />        String search = req.getParameter( "search" );<font color="#000000">//是否执行了搜索</font><br />        Vector&lt;Student&gt; temp = null; <font color="#000000">//用于存放临时反馈给用户的结果容器</font><br />                if ( op == null )<font color="#000000">//如果用户没有执行上/下一页的操作</font><br />                {<br />                    if ( search != null )<font color="#000000">//用户如果执行了搜索<br /></font>                    {<br />                        if ( sf.getFrom().equalsIgnoreCase( "class" ) )<font color="#000000">//如果是按班级查找</font><br />                        {<br />                            ss = service.getAllStudentBySchoolClassForAdmin( sf<br />                                    .getKey() );<font color="#000000">//获取from的关键字</font><br />                        }<br />                        else if ( sf.getFrom().equalsIgnoreCase( "name" ) )<font color="#000000">//如果是按姓名查找</font><br />                        {<br />                            ss = service.getAllStudentByNameForAdmin( sf<br />                                    .getKey() );<br />                        }<br />                        else if ( sf.getFrom().equalsIgnoreCase( "user" ) )<font color="#000000">//如果是按用户名查找</font><br />                        {<br />                            ss = service.getAllStudentByUserForAdmin( sf<br />                                    .getKey() );<br />                        }<br />                        else<br />                        {<br />                            ss = service.getAllStudentBySnForAdmin( sf.getKey() );<font color="#000000">//按学号查找</font><br />                        }<br />                        form.reset( mapping, req );<font color="#000000">//重置搜索表单</font><br />                    }<br />                    else<br />                    {<br />                        ss = service.getAllStudentForAdmin( sf.getAny() ); <font color="#000000">//</font><font color="#000000">用户未执行查找就显示全部，</font><br />                    }<br />                    if ( ss != null &amp;&amp; ss.size() != 0 )<font color="#000000">//如果查找不为空，有记录，那就创建一个分页对象</font><br />                    {<br />                        ps = new Page&lt;Student&gt;( ss, 10 );<font color="#000000">//将查询结果和每页显示记录数作为参数构件对象</font><br />                        temp = ps.gets();<font color="#000000">//并获取第一页</font><br />                    }<br />                }<br />                else<font color="#000000">//如果用户执行了操作</font><br />                {<br />                    if ( op.equals( "next" ) )<font color="#000000">//操作是下一页</font><br />                    {<br />                        temp = ps.getNextPage();<br />                    }<br />                    if ( op.equals( "previous" ) )<font color="#000000">//操作是上一页</font><br />                    {<br />                        temp = ps.getPreviouspage();<br />                    }<br />                }<br />                req.setAttribute( "search", SelectUtil.studentSearch() );<font color="#000000">//把搜索用到的表单放到request中</font><br />                req.setAttribute( "students", temp );<font color="#000000">//该页显示的学生</font><br />                req.setAttribute( "page", ps );<font color="#000000">//分页对象</font><br />                return mapping.findForward( "student" );<font color="#000000">//请求转发</font><br />    }<br />}<br /><br /><br /><font color="#000000">用到SelectUtil中的代码如下：<br /></font>/**<br />     * 获取学生查找类别的select<br />     * @return 学生查找类别<br />     * 2006-5-17 9:06:12<br />     */<br />    public static Vector&lt;LabelValueBean&gt; studentSearch()<br />    {<br />        Vector&lt;LabelValueBean&gt; s = new Vector&lt;LabelValueBean&gt;();<br />        s.add( new LabelValueBean( "按学号查找", "sn" ) );<br />        s.add( new LabelValueBean( "按班级查找", "class" ) );<br />        s.add( new LabelValueBean( "按姓名查找", "name" ) );<br />        s.add( new LabelValueBean( "按用户查找", "user" ) );<br />        return s;<br />    }<br /><font color="#000000">在看页面视图前先让我们看看Model吧，<br /></font><br />public class Student extends User<br />{<br />    private String sn;<br />    private SchoolClass schoolClass;</font>
				<font color="#000000">//这里的班级做为了一种对象，我们在视图显示的时候就有了一层嵌套</font>
		</p>
		<p>
				<font color="#ff0000">    public SchoolClass getSchoolClass()<br />    {<br />        return schoolClass;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setSchoolClass( SchoolClass schoolClass )<br />    {<br />        this.schoolClass = schoolClass;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getSn()<br />    {<br />        return sn;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public void setSn( String sn )<br />    {<br />        this.sn = sn;<br />    }</font>
		</p>
		<p>
				<font color="#ff0000">    public String getType()<br />    {<br />        return "student";<br />    }<br />}<br /><font color="#000000">在了解了model后，还是看看视图吧，<br /><br /><br />先放个查询表单：<br /></font><br />&lt;html:javascript dynamicJavascript="true" staticJavascript="true" formName="SearchForm" /&gt;<br />&lt;html:form action="/adminUser.do?search=true" onsubmit="return validateSearchForm(this)"&gt;<br /><br />&lt;html:select property="from" &gt;<br />&lt;html:options collection="search" property="value" labelProperty="label" /&gt;<br />&lt;/html:select&gt;<br /><br />&lt;html:text property="key" size="16" maxlength="16"/&gt;<br /><br />&lt;html:image src="images/search.gif"/&gt;<br /><br />&lt;/html:form&gt;<br /><br /><font color="#000000">由于模型中有嵌套，那么我们就将用到Nested标签，其实没有嵌套也可以使用这个标签，下面的是用于显示信息的，用迭迨器进行遍历request范围的students，你不安排范围，他会自动找到的，并把每次遍历的对象起名叫</font><font color="#000000">student，并作为层次的根元素，</font><font color="#000000"><br /></font><br />&lt;logic:iterate id="student" name="students"&gt;<br /><br />&lt;nested:root name="student"&gt;<br /><br />&lt;nested:nest property="schoolClass"&gt;&lt;nested:write property="schoolClass"/&gt;&lt;/nested:nest&gt;<font color="#000000">//寻找了student的schoolClass属性对象的schoolClass嵌套</font><br /><br />&lt;nested:write property="name"/&gt;      <font color="#000000">//student的名字</font><br /><br />&lt;nested:link page="/adminActions.do?method=deleteStudent" paramId="id" paramProperty="id" onclick="return window.confirm('您真的要删除吗？')"&gt;删除&lt;/nested:link&gt;<br /><br />&lt;/nested:root&gt;<br /><br /><font color="#000000">这里是显示分页对象的：</font><br /><br />第&lt;bean:write name="page" property="current" /&gt;页<br />共&lt;bean:write name="page" property="pages" /&gt;页<br />       <font color="#000000"> //上一页是否存在</font><br />        &lt;logic:equal name="page" property="previous" value="true"&gt;<br />               &lt;html:link page="/adminUser.do?part=student&amp;op=previous"&gt;<br />                &lt;font color="6795b4"&gt;上一页&lt;/font&gt;<br />               &lt;/html:link&gt;&amp;nbsp;&amp;nbsp;  <br />        &lt;/logic:equal&gt;<br />        &lt;logic:notEqual name="page" property="previous" value="true"&gt;上一页&amp;nbsp;&amp;nbsp;  &lt;/logic:notEqual&gt;<br />        <br />       <font color="#000000">//下一页是否存在</font><br />         &lt;logic:equal name="page" property="next" value="true"&gt;<br />         &lt;html:link page="/adminUser.do?part=student&amp;op=next"&gt;<br />          &lt;font color="6795b4"&gt;下一页&lt;/font&gt;<br />         &lt;/html:link&gt;&amp;nbsp;&amp;nbsp;  &lt;/logic:equal&gt;<br />        &lt;logic:notEqual name="page" property="next" value="true"&gt;下一页&amp;nbsp;&amp;nbsp;  &lt;/logic:notEqual&gt;<br />        <br /><br />共有&lt;bean:write name="page" property="total" /&gt;条数据<br /><br />&lt;/logic:iterate&gt;<br /><br /><font color="#000000">到这里不知道您看明白了多少，在我的这个JSP页里几乎没有任何的业务逻辑，这样的设计就比把HTML和JAVA搀杂在一起好了很多。</font><br /></font>
		</p>
<img src ="http://www.blogjava.net/baputista/aggbug/48246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baputista/" target="_blank">誰伴我闖蕩</a> 2006-05-26 00:29 <a href="http://www.blogjava.net/baputista/archive/2006/05/26/48246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>