??xml version="1.0" encoding="utf-8" standalone="yes"?>色在线亚洲视频www,久久精品国产亚洲av成人,国产亚洲日韩一区二区三区http://www.tkk7.com/baputista/Baputistazh-cnSun, 11 May 2025 14:05:49 GMTSun, 11 May 2025 14:05:49 GMT60通过dxml文g动态徏?http://www.tkk7.com/baputista/archive/2006/09/16/70083.htmlC我闖?/dc:creator>C我闖?/author>Sat, 16 Sep 2006 13:23:00 GMThttp://www.tkk7.com/baputista/archive/2006/09/16/70083.htmlhttp://www.tkk7.com/baputista/comments/70083.htmlhttp://www.tkk7.com/baputista/archive/2006/09/16/70083.html#Feedback1http://www.tkk7.com/baputista/comments/commentRss/70083.htmlhttp://www.tkk7.com/baputista/services/trackbacks/70083.html<?xml version="1.0" encoding="utf-8"?>
<Stoke>
 <Name ID="1" Type="VarChar" Length="10" Index="True">Ada</Name>
 <Sex ID="2" Type="VarChar" Length="2">female</Sex>
 <Age ID="3" Type="Integer">21</Age>
 <Comm>
  <Mobile ID="4" Type="VarChar" Length="15">13300008888</Mobile>
  <Email ID="5" Type="VarChar" Length="30">Ada@gmail.com</Email>
 </Comm>
</Stoke>

上面的xml描述在数据库中创Z张表

import java.io.*;
import java.sql.*;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class XmlToSql
{
 public static void getNode(NodeList nl,StringBuffer sql)
 {
  for(int i=0;i<nl.getLength();i++)
  {
   Node node = nl.item(i);
   if(node.getNodeType() == Node.ELEMENT_NODE)
   {
    if(node.hasAttributes())
    {
     sql.append(node.getNodeName()+" ");
     NamedNodeMap attr = node.getAttributes();
     sql.append(attr.getNamedItem("Type").getNodeValue());
     if(attr.getNamedItem("Length")!=null)
     {
      sql.append("("+attr.getNamedItem("Length").getNodeValue()+")");
     }    
     sql.append(",");
     if(attr.getNamedItem("Index")!=null && attr.getNamedItem("Index").getNodeValue().equals("True"))
     {
      sql.append("index index_"+node.getNodeName()+"("+node.getNodeName()+"),");
     }
    }
    else
    {
     getNode(node.getChildNodes(),sql);
    }       
   }
  }
 }
 
 public static void main(String[] args)
 {
  try
  {
   DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = fac.newDocumentBuilder();
   Document document = builder.parse(new File("Data.xml"));
   
   Node node = document.getFirstChild();
   
   StringBuffer sql = new StringBuffer("create table temp(id int(11) NOT NULL auto_increment,");
   getNode(node.getChildNodes(),sql);
   sql.append("PRIMARY KEY  (id))");
   
   Class.forName("com.mysql.jdbc.Driver");
   String url ="jdbc:mysql://localhost/test";
   Connection conn= DriverManager.getConnection(url,"root","root");
   Statement stmt = conn.createStatement();
   stmt.execute(sql.toString());
  }
  catch(Exception e){
   e.printStackTrace();
  }
 } 
}



]]>
Hibernate配置文g的几个例?/title><link>http://www.tkk7.com/baputista/archive/2006/09/09/68694.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Sat, 09 Sep 2006 04:02:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/09/09/68694.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/68694.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/09/09/68694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/68694.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/68694.html</trackback:ping><description><![CDATA[ <p>在这里主要讲两个我亲w体验到的例子与大家分nQ?br /><br />1.多对一<br />2.l承<br /><br />q两个是在应用中最常见的地方:<br /><br /><strong>1.多对一</strong><br /><br />何谓多对一Q以我的例子ZQ在大学里,一个学院里有很多专业,一个专业下有很多班U?br /><br />专业的字D里会有学院的类型来标识它所在的学院Q而学院里很少需要有专业的字D,若想查到学院里的专业Q返回专业的List比把它放到学院里的Set变量更划!所以在昄的应用中很少q样做,再有在学院的表里也不存在专业相关的描qͼ所以有画蛇添之嫌?br /><br />所以呢Q专业对于学院,是多对一了,所谓的多对一也是从专业的角度来看的!但是当我们初始化q个对象Q或者持久化q个对象的时候,能否带上它的学院属性呢Q这个很关键Q也很必要,q就需要附加的一个属性来完成了:<br /><br />下面我们以学院专业ؓ例子Q来看看该怎么写这个配|文Ӟ<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 & 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 & set<br />}<br /></font> <br />下面是配置文g了:<br /><br /><font color="#006400"><hibernate-mapping></font></p> <p> <font color="#006400"> <class name="subject.model.Institute"><br />      <id name="id"><br />         <generator class="increment"/><br />       </id><br /><br />      <property name="institute"/><br /> </class><br /><br /><class name="subject.model.Department"><br />      <id name="id"><br />         <generator class="increment" /><br />      </id><br /><br />      <property name="department" /><br />      <br />      <many-to-one name="institute" class="subject.model.Institute" <br />          column="instituteId" lazy="false"/><font color="#000000">//多对一Qlazy="false"来将依赖延迟讄为false</font><br />   </class><br /> <br /></hibernate-mapping><br /></font> <br />所谓依赖gq就是说Q如果我们把他设|ؓtrueQ那么我们得到的department中的该属性初始化为空Q否则就有该属性了Q?br /><br /><strong>2.l承<br /></strong><br />在我的系l中Q存在三U用P理员、学生、教师,他们都有l合的属性,也有个性的地方Q具体的cMl如下:<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 & 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">在数据库中我把三U角色的对象存放在一个表中,用一个字D|区分三种角色Q在hibernate映射l承时属于一U情况,可以参照书中的介l:<br /><br /></font><font color="#000080"><hibernate-mapping></font></p> <p> <font color="#000080"> <class name="subject.model.User" discriminator-value="not null"></font> <font color="#000000">//q里的not null很关键,没这个就会出现问?/font> </p> <p> <font color="#000080">  <id name="id"><br />   <generator class="increment" /><br />  </id><br />  <br />  <discriminator column="type" type="character" /><br />  <br />  <property name="user" /><br />  <property name="password" /><br />  <property name="name" /><br />  <property name="telphone" /></font> </p> <p> <font color="#000080">  <subclass name="subject.model.Admin" discriminator-value="a"><font color="#000000">//存储对象cd的标识符</font><br />   <property name="grade" column="sn" /><font color="#000000">//对于每种对象的字D都攑ֈ数据库的一列里?/font><br />  </subclass><br />  <br />  <subclass name="subject.model.Teacher" discriminator-value="t"><br />   <property name="level" column="sn" /><br />   <property name="confirm" column="about" /><br />  </subclass><br />  <br />  <subclass name="subject.model.Student" discriminator-value="s"><br />   <br />   <property name="sn" /><br />   <br />   <many-to-one name="schoolClass" class="subject.model.SchoolClass" <br />    column="about" lazy="false"/><br />    <br />  </subclass></font> </p> <p> <font color="#000080"> </class></font> </p> <p> <font color="#000080"></hibernate-mapping><br /></font> </p> <img src ="http://www.tkk7.com/baputista/aggbug/68694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-09-09 12:02 <a href="http://www.tkk7.com/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.tkk7.com/baputista/archive/2006/09/09/68687.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Sat, 09 Sep 2006 03:24:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/09/09/68687.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/68687.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/09/09/68687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/68687.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/68687.html</trackback:ping><description><![CDATA[ <p>我曾l介l过自己构徏的分늨序,在那个程序中Q我们把分页昄的数据放CAction的成员中Q而没有放在execute函数中,如果把他攑ֈexecute函数中会产生什么效果呢Q由于我们没有采用页码来定数据Q而是单纯的调用下一|完成的,所以当变量攑ֈexecute中时我们每次讉K到的都只会是W一,q就是Struts的诟病,单用hơ访问都会ؓ用户创徏一个新的线E,而非Servlet为每用户单独开辟一个线E,所以才会生以上的问题Q?br /><br />那问题该如何解决呢?<br /><br />1.用页码来区分需要显C的数据更有?br />2.Spring可以解决q个诟病<br /><br />合二Z来介l一下吧Q?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">//当前늚l束数据</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">//需要显C的数据</font> </p> <p> <font color="#ff0000"> public Page( List list, int each )<font color="#000000">//以需要显C的数据和每要昄的数据ؓ参数q行初始?/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 >= pages )<br />  {<br />   next = false;<font color="#000000">//判断是否有下一?/font><br />  }<br />  else<br />  {<br />   next = true;<br />   nextPage = current + 1;<font color="#000000">//有,q得出来下一|多少呢!</font><br />  }<br />  if ( total < each )<br />  {<br />   start = 0;<font color="#000000">//q页昄多少数据啊?如果是最后一,只显C整除后的余C</font><br />   end = total;<br />  }<br />  else<br />  {<br />   start = 0;<font color="#000000">//否则要显C每需要显C的数据?/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 > 0 && page <= pages )<br />  {<br />   current = page;<font color="#000000">//page在有效范围内则ؓ当前?/font><br />  }<br />  if ( ( current - 1 ) > 0 )<font color="#000000">//计算上一|否存在以及?/font><br />  {<br />   previous = true;<br />   previousPage = current - 1;<br />  }<br />  else<br />  {<br />   previous = false;<br />  }<br />  if ( current >= 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 < 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">//把显C的数据攑ֈ一个新的List?/font><br />  for ( int i = start; i < end; i++ )<br />  {<br />   gets.add( list.get( i ) );<br />  }<br />  return gets;<br /> }<br />}<br /><br /></font> <font color="#000000">上面的Page Bean比那个就略的很多Q我们再来看看Action怎么来做Q?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 && 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 />q样我们可以把分页对象和List攑ֈExecute中了Q在q里我们把业务逻辑对象AdminManager的实例mgr声明成了bean的Ş式,q样可以在Spring中利用ioc来注入:<br /><br />Struts的声明:<br /><br /><font color="#000080"><action path="/admin" type="org.springframework.web.struts.DelegatingActionProxy" /><br /></font><br />Spring中的声明Q?br /><br /></font> <font color="#0000ff"><!-- 业务逻辑 --><br /> <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><br />  <property name="transactionManager" ref="transactionManager" /><br />  <property name="transactionAttributes"><br />   <props><br />    <prop key="save*">PROPAGATION_REQUIRED</prop><br />    <prop key="remove*">PROPAGATION_REQUIRED</prop><br />    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop><br />   </props><br />  </property><br /> </bean></font> </p> <p> <font color="#0000ff"> <bean id="adminManager" parent="txProxyTemplate"><br />  <property name="target"><br />   <bean class="subject.service.impl.AdminManagerImpl"><br />    <property name="dao" ref="dao" /><br />   </bean><br />  </property><br /> </bean><br /><br /><bean name="/admin/admin" class="subject.web.action.AdminAction" singleton="false"><br />  <property name="adminManager"><br />   <ref bean="adminManager" /><br />  </property><br /> </bean><br /><br /></font> <font color="#000000">从而实CStruts和Spring的完暇接,singleton="false"从而可以解军_例的诟病Q?/font> </p> <img src ="http://www.tkk7.com/baputista/aggbug/68687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-09-09 11:24 <a href="http://www.tkk7.com/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.tkk7.com/baputista/archive/2006/08/24/65465.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Thu, 24 Aug 2006 02:56:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/08/24/65465.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/65465.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/08/24/65465.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/65465.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/65465.html</trackback:ping><description><![CDATA[ <p>到现在我也没有弄明白Acegi里面很多的功?刚刚开始学的时候我已l被它那J琐的配|震慑住了,不过当我动v手来一步步实现的时?才发现其实它q没有那么难,当然随着学习的深?会渐渐再发现q一点吧,现在p我们初学者一切体验Acegi的功能吧!<br /><br />q以我传l的例子Z:<br />毕业设计选题pȝ,三种角色:教师,学生,理?我想让他们的登陆都在一个界面下自动识别,而无需q行w䆾选择,登陆?他们分别到各自的admin.jsp,stu.jsp,teacher.jsp<br />在数据库中的表结构如?很多属性略):<br />id--- user---password--type---about<br /><br />type是用来存储用Lcd,分别有a,t,s分别对应三种角色<br />about对应的是acegi里所需要的enable,用户是否可用</p> <p>在model?我们采用了承关p?<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(); //q个是用来反映用戯色的关键函数,在子cd?从而实现多?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;         //教师的职U?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;         //学生的班U?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;           //理员的U别<br />//set and get method</p> <p> public String getType()<br /> {<br />  return Constants.ADMIN;<br /> }<br />}<br /><br />对于三者所共有的属性在数据库里,都存在一个字D?而依据不同的角色拥有不同的含?学生的班U则存放在了about?只要学生有班U?他就able,否则enable?而管理员和教师则默认?!<br /><br />q种是属于一个承树存放在一个表的情?Hibernate的配|如?<br /><hibernate-mapping></p> <p> <class name="subject.model.User" discriminator-value="not null"></p> <p>  <id name="id"><br />   <generator class="increment" /><br />  </id><br />  <br />  <discriminator column="type" type="character" /><br />  <br />  <property name="user" /><br />  <property name="password" /><br />  <property name="name" /><br />  <property name="telphone" /></p> <p>  <subclass name="subject.model.Admin" discriminator-value="a"><br />   <property name="grade" column="sn" /><br />  </subclass><br />  <br />  <subclass name="subject.model.Teacher" discriminator-value="t"><br />   <property name="level" column="sn" /><br />  </subclass><br />  <br />  <subclass name="subject.model.Student" discriminator-value="s"><br />   <br />   <property name="sn" /><br />   <br />   <many-to-one name="schoolClass" class="subject.model.SchoolClass" <br />    column="about" update="false" insert="false" /><br />    <br />  </subclass></p> <p> </class></p> <p></hibernate-mapping><br /><br />=============================================<br />上面的这些都是模型的基础,下面再讲怎么样配合Spring和Acegi实现pȝ的安全与登陆<br />在Spring中Hibernate的配|只介绍不说?<br /><!-- 定义DBCP数据?--><br /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><br />  <property name="driverClassName" value="com.mysql.jdbc.Driver" /><br />  <property name="url" value="jdbc:mysql://localhost/subject?useUnicode=true&amp;characterEncoding=gbk" /><br />  <property name="username" value="root" /><br />  <property name="password" value="" /><br />  <property name="maxActive" value="100" /><br />  <property name="maxIdle" value="30" /><br />  <property name="maxWait" value="1000" /><br />  <property name="defaultAutoCommit" value="true" /><br />  <property name="removeAbandoned" value="true" /><br />  <property name="removeAbandonedTimeout" value="60" /><br /> </bean></p> <p> <!-- Hibernate --><br /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><br />  <property name="dataSource" ref="dataSource" /><br />  <property name="mappingResources"><br />   <list><br />    <value>subject/model/User.hbm.xml</value><br />   </list><br />  </property><br />  <property name="hibernateProperties"><br />   <props><br />    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop><br />   </props><br />  </property><br /> </bean></p> <p> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><br />  <property name="sessionFactory" ref="sessionFactory" /><br /> </bean><br /><br /><!-- Dao对象 --><br /><bean id="userDao" class="subject.dao.hibernate.UserDaoImpl"><br />  <property name="sessionFactory" ref="sessionFactory" /><br /> </bean><br /><br /><!-- 业务逻辑 --><br /> <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><br />  <property name="transactionManager" ref="transactionManager" /><br />  <property name="transactionAttributes"><br />   <props><br />    <prop key="save*">PROPAGATION_REQUIRED</prop><br />    <prop key="remove*">PROPAGATION_REQUIRED</prop><br />    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop><br />   </props><br />  </property><br /> </bean><br /><br /><bean id="userManager" parent="txProxyTemplate"><br />  <property name="target"><br />   <bean class="subject.service.impl.UserManagerImpl"><br />    <property name="userDao" ref="userDao" /><br />   </bean><br />  </property><br /> </bean><br /><br /><!-- Struts --><br /> <bean name="/user" class="subject.web.action.UserAction" singleton="false"><br />  <property name="userManager"><br />   <ref bean="userManager" /><br />  </property><br /> </bean><br />==================<br />上面具体的不用了?无非是调用和数据库的操?<br />下面p对Acegiq行声明?<br />我不用Ctrl+c和Ctrl+V的方式对Acegiq行介绍,没有意义,随便google׃大堆<br />我们想主要在q样的系l中需要的安全{略都有哪些?<br />1.用户的登?br />2.防止多个用户登陆一个帐?br />3.用户的注销<br />4.防止非法用户的访?br /><br />我这个程序所涉及到的只有q些,下面p行说?<br /><br />在web.xml的声?<br /><!-- Acegi安全控制 Filter 配置 --><br />    <filter><br />        <filter-name>securityFilter</filter-name><br />        <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class><br />        <init-param><br />            <param-name>targetClass</param-name><br />            <param-value>org.acegisecurity.util.FilterChainProxy</param-value><br />        </init-param><br />    </filter><br />    <br />    <filter-mapping><br />        <filter-name>securityFilter</filter-name><br />        <url-pattern>/*</url-pattern><br />    </filter-mapping><br /><br />Acegi通过实现了Filter接口的FilterToBeanProxy提供一U特D的使用Servlet Filter的方式,它委托Spring中的Bean -- FilterChainProxy来完成过滤功能,q样q化了web.xml的配|,q且利用Spring IOC的优ѝFilterChainProxy包含了处理认证过E的filter列表Q每个filter都有各自的功能?br /><br /><!-- ======================== FILTER CHAIN ======================= --><br /> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"><br />  <property name="filterInvocationDefinitionSource"><br />   <value><br />    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br />    PATTERN_TYPE_APACHE_ANT<br />    <br />    /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,<br />         securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor<br />   </value><br />  </property><br /> </bean><br /><br />大体上先介绍一?<br />httpSessionContextIntegrationFilter:每次request?HttpSessionContextIntegrationFilter从Session中获取Authentication对象Q在request完后, 又把Authentication对象保存到Session中供下次request使用,此filter必须其他Acegi filter前用,使之能跨多个请求?br />logoutFilter:用户的注销<br />authenticationProcessingFilter:处理登陆h<br />exceptionTranslationFilter:异常转换qo?br />filterInvocationInterceptor:在访问前q行权限?br /><br />q些q如在web.xml声明一pd的过滤器,不过当把他们都声明在spring中就可以享受Springl我们带来的方便了?br /><br />下面是对这些过滤器的具体声明:<br />只对有用的地方进行声明,别的地方几乎都是默许?br /><!-- ======================== FILTER ======================= --><br /> <bean id="httpSessionContextIntegrationFilter" <br />  class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" /></p> <p> <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"><br />  <constructor-arg value="/index.htm" />             d后所转向的位|?br />  <constructor-arg><br />            <list><br />                <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/><br />            </list><br />        </constructor-arg><br />  <property name="filterProcessesUrl" value="/logout.htm" />        定义用户注销的地址Q?br /> </bean><br /><br />下面的这个过滤器Q我们根据自q需求有了自q实现Q?/p> <p> <bean id="authenticationProcessingFilter" class="subject.web.filter.UserAuthenticationProcessingFilter"><br />  <property name="authenticationManager" ref="authenticationManager"/>  下面会介l的用来起到认证理的作?br />  <property name="authenticationFailureUrl" value="/login.htm?error=wrong"/>  登陆p|的地址<br />  <property name="defaultTargetUrl" value="/login.htm"/>       登陆成功的地址<br />  <property name="filterProcessesUrl" value="/j_security_check"/>      登陆h的地址<br />  <property name="userManager" ref="userManager"/>        自己d的属性,q样可以访问到我们的业务逻辑<br />  <property name="exceptionMappings">   出现异常所对应的地址<br />            <value><br />                org.acegisecurity.AuthenticationException=/login.htm?error=fail     登陆p|                org.acegisecurity.concurrent.ConcurrentLoginException=/login.htm?error=too        已登陆了<br />            </value><br />        </property><br /> </bean><br /> <br /> <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/></p> <p> <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"><br />  <property name="authenticationEntryPoint"><br />   <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"><br />    <property name="loginFormUrl" value="/login.htm?error=please"/>//如果用户没登陆就惌问,先到q里登陆?br />    <property name="forceHttps" value="false"/><br />   </bean><br />  </property><br /> </bean><br /> <br /> <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"><br />  <property name="authenticationManager" ref="authenticationManager"/>       认证服务<br />  <property name="accessDecisionManager"><br />   <bean class="org.acegisecurity.vote.AffirmativeBased"><br />    <property name="allowIfAllAbstainDecisions" value="false"/><br />    <property name="decisionVoters"><br />     <list><br />      <bean class="org.acegisecurity.vote.RoleVoter"><br />                    <property name="rolePrefix" value=""/>         //q里定义数据库中存放的角色和我们在这里声明的角色间是否需要加个前~Q我没加<br />                </bean><br />     </list><br />    </property><br />   </bean><br />  </property><br />  <property name="objectDefinitionSource"><br />            <value><br />                PATTERN_TYPE_APACHE_ANT<br />                <br />                /admin.htm*=a         q里是数据库中对应的tyep a<br />                /student*=s           ׃没有前缀和数据库里一?br />                /teacher*=t<br />            </value><br />        </property><br /> </bean><br /> <br /> <bean id="loggerListener"<br />          class="org.acegisecurity.event.authentication.LoggerListener"/>       记录事g<br /><br />下面p说明我们的认证服务了Q其起到的关键作用就是用来保证用L陆n份的验证Q?br /><br />它将验证的功能委托给多个ProviderQƈ通过遍历Providers, 以保证获取不同来源的w䆾认证Q若某个Provider能成功确认当前用Lw䆾Qauthenticate()Ҏ会返回一个完整的包含用户授权信息的Authentication对象Q否则会抛出一个AuthenticationException?br /><br />先声明一个管理器吧,在上面的qo器中都已l用到过?br /><!-- ======================== AUTHENTICATION ======================= --><br /> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"><br />  <property name="providers"><br />   <list><br />    <ref local="daoAuthenticationProvider" />   我仅仅用?从数据库中读取用户信息验证n?br />   </list><br />  </property><br />  <property name="sessionController"><br />   <bean id="concurrentSessionController" <br />    class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl"><br />    <property name="maximumSessions"><br />     <value>1</value>每个用户同时登陆一?br />    </property><br />    <property name="sessionRegistry"><br />     <bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl" /><br />    </property><br />    <property name="exceptionIfMaximumExceeded" value="true" /><br />   </bean><br />  </property><br /> </bean><br /> 来实现唯一的一个ProviderQ从数据库验证n?br /> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"><br />  <property name="userDetailsService"><br />   <bean id="jdbcDaoImpl"<br />            class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"><br />          <property name="dataSource" ref="dataSource"/><br />          <property name="usersByUsernameQuery"><br />              <value><br />                  select user,password,about from user where user = ?        查找用户的查询语句,只需要把你数据库中的用户和密码以及enable相对应上p<br />              </value><br />          </property><br />          <property name="authoritiesByUsernameQuery"><br />              <value><br />                  select user,type from user where user = ?           q里是把用户和权限对应上,在appfuse中用的两个表Q我都放一个表里了Q所以就用这一个就行问题的关键是要让它能找C个字D,构成一个对?br />              </value><br />          </property><br />      </bean><br />  </property><br />  <property name="userCache"> ~存都这么写Q?br />   <bean class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"><br />    <property name="cache"><br />     <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean"><br />      <property name="cacheManager"><br />       <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/><br />      </property><br />      <property name="cacheName" value="userCache"/><br />     </bean><br />    </property><br />   </bean><br />  </property><br /> </bean><br /><br />==============<br />对于上面登陆h的处理器我借鉴了springSideQ实现的Ҏ如下Q?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 />       && auth.getPrincipal() instanceof UserDetails )<br />     {<br />      UserDetails ud = (UserDetails) auth.getPrincipal();//上面声明的sql无非是要包装成q个对象<br />      User user = userManager.getUser( ud.getUsername() );从业务逻辑里找到用P攑ֈsession?br />      httpSession.setAttribute( Constants.USER, user );<br />     }<br />    }<br />   }<br />  }<br />  return requiresAuth;<br /> }<br />}<br /><br />在看看我的login.htm在登陆成功时是怎么工作的吧Q?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 )对于不同的错误,都加以提C?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 />当然QAcegi需要介l的东西太多了,我只把我q次认ؓ有必要解释的东西写在了上面让大家来参考,作ؓ能google到的东西Q比如对于认证的方式q有很多Q我没有详l的介绍Q在学习Acegiq程中,把它自带的例子弄清楚很关键,希望大家一起学习一起共勉!<br /><br /></p> <img src ="http://www.tkk7.com/baputista/aggbug/65465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-08-24 10:56 <a href="http://www.tkk7.com/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.tkk7.com/baputista/archive/2006/08/09/62558.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Wed, 09 Aug 2006 06:19:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/08/09/62558.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/62558.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/08/09/62558.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/62558.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/62558.html</trackback:ping><description><![CDATA[ <p>了览器的支持QApplet在互联网上永q不会有自己的舞収ͼ而我却很Lq种把应用程序放到界面里的东东,今天无聊Q把以前写过的一个表辑ּ求值的E序Q顺手拿Applet改写一下,再让大家体验一下MVC设计模式的应用吧Q?br /><br /><br />=======================ExpressionModel===================<br /><br />/*<br /> *q个是表达式的模型lg了,它的三个属性,分别代表了它的中则表辑ּ和右则表辑ּ<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<String> middle;<br /> private ArrayList<String> right;<br /> private String input, result;</p> <p> public ExpressionModel()<br /> {<br />  middle = new ArrayList<String>();<br />  right = new ArrayList<String>();<br /> }<br /><br /> //判断一个字W是不是操作W?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 />//我们输入的中则表达式{换成逆L兰式<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)) <= priority(stack.top()) && 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 >= 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<String> 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 />//我们用到的自q堆栈<br />package expression;</p> <p>import java.util.*;</p> <p>public class MyStack<br />{<br /> <br /> private LinkedList<String> list;<br /> private int top;<br /> <br /> public MyStack() <br /> {<br />  list = new LinkedList<String>();<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 />//控制器组Ӟ包括一个输入域和两个按U?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 />       "误入有效表辑ּQ?, "错误", <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 />//用来昄l果的视?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 />//最后把q些l装到这里吧<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 />把这几个cL包到一个jar文g后,再创Zhtm文g来访问它<br /><br /><object<br />    classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"<br />    codebase = "<a <br />    WIDTH = 320 HEIGHT = 100 ><br />    <PARAM NAME = CODE VALUE = "expression.Expression" ><br />    <PARAM NAME = ARCHIVE VALUE = "expression.jar" ><br />    <param name = "type" value = "application/x-java-applet;version=1.5"><br />    <param name = "scriptable" value = "false"><br /></object><br /><br />q样p了,不过你的机器需要安装jre 5<br /><br /></p> <img src ="http://www.tkk7.com/baputista/aggbug/62558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-08-09 14:19 <a href="http://www.tkk7.com/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.tkk7.com/baputista/archive/2006/08/04/61850.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Fri, 04 Aug 2006 12:36:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/08/04/61850.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/61850.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/08/04/61850.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/61850.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/61850.html</trackback:ping><description><![CDATA[ <p>在appfuse的web.xml声明文g中有下面的类似声明:<br /><br /><filter><br />        <filter-name>rewriteFilter</filter-name><br />        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class><br />        <init-param><br />            <param-name>logLevel</param-name><br />            <param-value>commons</param-value><br />        </init-param><br />    </filter></p> <p> <filter-mapping><br />        <filter-name>rewriteFilter</filter-name><br />        <url-pattern>/*</url-pattern><br />    </filter-mapping><br /><br /><br />它所应用到的包存攑֜lib下的urlrewrite-3.0-beta.jar<br /><br />它和以上的两部分Q以?web-inf/urlrewrite.xml构成了对url地址的美?br /><br />打开q个文gQ我们可以看C下的声明Q?br /><br /><?xml version="1.0" encoding="utf-8"?><br /><!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"<br />    "<a ></p> <p><!-- <a >https://urlrewrite.dev.java.net/manual/3.0</a> --><br /><urlrewrite><br />    <rule><br />        <from>^/user/(.*).html$</from><br />        <to type="forward">/editUser.html\?username=$1</to><br />    </rule><br /></urlrewrite><br /><br />q样pȝ完成了url地址的editUser.html?username=****的美?br /><br />如将 <br />http://localhost/aaa/bbb.<a target="_blank"><font color="#000000">jsp</font></a>?id=99&name=abc <br />表现为: <br />http://localhost/aaa/bbb/99_abc.html <br />配置如下Q?<br /><rule> <br /><from>/aaa/bbb/([0-9]+)_([a-z]+).html</from> <br /><to>/../aaa/bbb.<a target="_blank"><font color="#000000">jsp</font></a>?id=$1&name=$2</to> <br /></rule> <br /></p> <img src ="http://www.tkk7.com/baputista/aggbug/61850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-08-04 20:36 <a href="http://www.tkk7.com/baputista/archive/2006/08/04/61850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Spring中配|log4jhttp://www.tkk7.com/baputista/archive/2006/08/04/61614.htmlC我闖?/dc:creator>C我闖?/author>Thu, 03 Aug 2006 16:31:00 GMThttp://www.tkk7.com/baputista/archive/2006/08/04/61614.htmlhttp://www.tkk7.com/baputista/comments/61614.htmlhttp://www.tkk7.com/baputista/archive/2006/08/04/61614.html#Feedback0http://www.tkk7.com/baputista/comments/commentRss/61614.htmlhttp://www.tkk7.com/baputista/services/trackbacks/61614.html
<!--如果不定义webAppRootKey参数Q那么webAppRootKey是~省?webapp.root"-->
 <context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>ssh.root</param-value>
 </context-param>

q里的ssh是http://localhost:8080/ssh/

而root是系l开发目录中ssh/root

q样配置文g以及日志文g可以在spring的帮助下Q放到开发环境中的Q意位|?br />
<!--由Sprng载入的Log4j配置文g位置-->
 <context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/log4j.properties</param-value>
 </context-param>

在这里定位配|文Ӟ需要的是从root开始的l对路径

<!--Spring默认hLog4j配置文g的间?单位为millisecond-->
 <context-param>
  <param-name>log4jRefreshInterval</param-name>
  <param-value>60000</param-value>
 </context-param>

<!--Spring log4j Config loader-->
 <listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>

讄监听?br />


/////////////////
之后我们可以配|log4j配置文g?br />
#先设|?br />log4j.rootCategory=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
#在这里设|日志需要存攄位置Q这里的变量是我们在web.xml里设|的
log4j.appender.file.File=${ssh.root}/WEB-INF/logs/subject.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=0
log4j.appender.file.layout=org.apache.log4j.SimpleLayout
log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n

有了上面的配|,我们可以查看日志了Q?img src ="http://www.tkk7.com/baputista/aggbug/61614.html" width = "1" height = "1" />

]]>
UML扫盲普及Q?/title><link>http://www.tkk7.com/baputista/archive/2006/06/26/55215.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Mon, 26 Jun 2006 12:47:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/06/26/55215.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/55215.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/06/26/55215.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/55215.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/55215.html</trackback:ping><description><![CDATA[ <img height="849" alt="未命?1.jpg" src="http://www.tkk7.com/images/blogjava_net/baputista/未命?1.jpg" width="756" border="0" /> <br /> <br />现在我向大家q行uml扫盲性普及,如果您还不知道uml是什么,那么最单的Q类g面的q样的图是uml图,大家C了,别跟辽宁xa化工大学的张国玉q个老师似的Q说我论文里的这个图是电路图Q因此说我的毕业设计不合|<img src ="http://www.tkk7.com/baputista/aggbug/55215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-06-26 20:47 <a href="http://www.tkk7.com/baputista/archive/2006/06/26/55215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验Struts(6)---L非法的登陆方?/title><link>http://www.tkk7.com/baputista/archive/2006/05/26/48248.html</link><dc:creator>C我闖?/dc:creator><author>C我闖?/author><pubDate>Thu, 25 May 2006 16:48:00 GMT</pubDate><guid>http://www.tkk7.com/baputista/archive/2006/05/26/48248.html</guid><wfw:comment>http://www.tkk7.com/baputista/comments/48248.html</wfw:comment><comments>http://www.tkk7.com/baputista/archive/2006/05/26/48248.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/baputista/comments/commentRss/48248.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baputista/services/trackbacks/48248.html</trackback:ping><description><![CDATA[ <p>如果用户直接输入了地址Q不也可以直接访问吗Q理Z是,我们可以加入sessionq行跟踪Q以杜绝此类型事件发生,我们是不是要把每ơ对session的判断依ơ拷到每个页里呢Q之后下ơ需要验证的SESSION换了Q我们再换?太浪费了Q我的做法是做了一个自定义标签Q来解决q个问题?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">//错误的提C?/font><br />    private String scope = "";<font color="#000000">//要严整变量的范围</font><br />    private String to = "go";</font> <font color="#000000">//如果验证p|Q是页面后退Q还是定位到哪里Q?/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">//先设Z可用</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">//如果可用ql执行此늚其余部分</font><br />        else<br />        {<font color="#000000">//否则Q哈?/font><br />            try<br />            {<br />                if ( to.equalsIgnoreCase( "go" ) ) <font color="#000000">//现在p|了,q怎么回到你该到的地方</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">//后退一下页面来L</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部分Q?br /><br />public static void callParentGo( Writer out, String msg, String url )<br />            throws IOException<br />    {<br />        out.write( "<script language=\"javascript\">" );<br />        out.write( "alert(\"" + msg + "\");" );<br />        out.write( "parent.location.href=\"" + url + "\";" );<br />        out.write( "</script>" );<br />    }<br />public static void callBack( Writer out, String msg ) throws IOException<br />    {<br />        out.write( "<script language=\"javascript\">" );<br />        out.write( "alert(\"" + msg + "\");" );<br />        out.write( "parent.history.back();" );<br />        out.write( "</script>" );<br />    }<br /><br /><br />写个check.tld部v吧,<br /><br /><?xml version = "1.0"?><br /><taglib><br /> <tlibversion>1.0</tlibversion><br /> <jspversion>1.1</jspversion><br /> <tag><br />  <name>check</name><br />  <tag-class>com.boya.subject.util.CheckTag</tag-class><br />  <attribute><br />   <name>check</name><br />   <required>true</required><br />  </attribute><br />  <attribute><br />   <name>url</name><br />   <required>false</required><br />  </attribute><br />  <attribute><br />   <name>msg</name><br />   <required>true</required><br />  </attribute><br />  <attribute><br />   <name>scope</name><br />   <required>true</required><br />  </attribute><br />  <attribute><br />   <name>to</name><br />   <required>false</required><br />  </attribute><br /> </tag><br /></taglib><br /><br /><br />?/font> <font color="#000000">只要在每个页面里写下q个可以判定用h否登陆了<br /><br /><%@ taglib prefix="boya" uri="/WEB-INF/check.tld" %><br /><boya:check check="admin" msg="理员尚未登陆,L陆!" scope ="session"/><br /><br />如果没有登陆那么Q会自动提示到首늙陆,不错Q很完美吧?<br /><br />当然不是Q您可以提出您的见解。。。?/font> </p> <img src ="http://www.tkk7.com/baputista/aggbug/48248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baputista/" target="_blank">C我闖?/a> 2006-05-26 00:48 <a href="http://www.tkk7.com/baputista/archive/2006/05/26/48248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验Struts(5)---从分体会MVChttp://www.tkk7.com/baputista/archive/2006/05/26/48246.htmlC我闖?/dc:creator>C我闖?/author>Thu, 25 May 2006 16:29:00 GMThttp://www.tkk7.com/baputista/archive/2006/05/26/48246.htmlhttp://www.tkk7.com/baputista/comments/48246.htmlhttp://www.tkk7.com/baputista/archive/2006/05/26/48246.html#Feedback0http://www.tkk7.com/baputista/comments/commentRss/48246.htmlhttp://www.tkk7.com/baputista/services/trackbacks/48246.html大家都知道Struts是一U基于MVC的结构,而这个MVC又怎么L解呢Q书上阐q的一般都很详l,而我的理解很直白Q我们可以把业务逻辑攑ֈ每个JSP面中,当你讉K一个JSP面的时候,可以看C务逻辑得到的结果,而把q些业务逻辑与HTML代码ҎC一P一定会造成一些不必要的麻烦,可以不可以不让我们的业务逻辑和那些HTML代码ҎC起呢Q多得搀杂一些,那干脆,量的吧,于是我们可以试着把业务逻辑的运过E放C个Action里,我们讉Kq个ActionQ之后Action执行业务逻辑Q最后把业务逻辑的结果放到request中,q将面h转发l一个用于显C结果的jsp面Q这Pq个面可以少d多的业务逻辑Q而只是单U的LCZ些业务逻辑计算l果的页面而已。这时的ActionUCؓ控制器,JSP可以叫做视图了Q而控制器操作的业务对象,无非应该叫模型了!

从上面的话,我们来分析一下当我们要做一个分|所需要的部分Q而在q之前,我们先看看他们的执行q程吧,首先我们W一ơ请求访问一个页面,它会把所有记录的前N条显C给我们Q之后计是否有下一,{类似的信息Q当我们点下一늚时候,p取下一늚信息Q我们还可以d一个搜索,比如我们用于昄学生的,可以安学生姓名查找,学号查找Q班U查找。而对于显C的对象Q我们一般也都会装为javabeanQ所以用于放|查询结果的容器是不定的Q而这Ӟ我们需要用泛型来提升我们的代码效率Q?br />
首先我们写一个用于分|C的javabeanQ?br />
package com.boya.subject.model;

import java.util.Vector;

public class Page<E>
{
    private int current = 1;        //当前?br />    private int total = 0;         //总记录数
    private int pages = 0;    //总页?/font>
    private int each = 5;         //每页昄
    private int start = 0;      //每页昄的开始记录数
    private int end = 0;       //每页昄的结束记录数
    private boolean next = false;        //是否有下一?/font>
    private boolean previous = false;  //是否有上一?/font>
    private Vector<E> v = null;   
//存放查询l果的容?/font>

    public Page( Vector<E> v ,int per)
    {
        this.v = v;
        each = per;
        total = v.size();   //容器的大就是ȝ记录?/font>
        if ( total % each == 0 )
            pages = total / each;       //计算总页?/font>
        else
            pages = total / each + 1;
        if ( current >= pages )
        {
            next = false;
        }
        else
        {
            next = true;
        }
        if ( total < each )
        {
            start = 0;
            end = total;
        }
        else
        {
            start = 0;
            end = each;
        }
    }
   
    public int getCurrent()
    {
        return current;
    }

    public void setCurrent( int current )
    {
        this.current = current;
    }

    public int getEach()
    {
        return each;
    }

    public void setEach( int each )
    {
        this.each = each;
    }

    public boolean isNext()
    {
        return next;
    }

    public void setNext( boolean next )
    {
        this.next = next;
    }

    public boolean isPrevious()
    {
        return previous;
    }

    public void setPrevious( boolean previous )
    {
        this.previous = previous;
    }

    public int getEnd()
    {
        return end;
    }

    public int getPages()
    {
        return pages;
    }

    public int getStart()
    {
        return start;
    }

    public int getTotal()
    {
        return total;
    }

 //获取下一늚对象?/font>  

public Vector<E> getNextPage()
    {
        current = current + 1;
        if ( (current - 1) > 0 )
        {
            previous = true;
        }
        else
        {
            previous = false;
        }
        if ( current >= pages )
        {
            next = false;
        }
        else
        {
            next = true;
        }
        Vector<E> os = gets();
        return os;
    }

 //获取上一?/font>

    public Vector<E> getPreviouspage()
    {
        current = current - 1;
        if ( current == 0 )
        {
            current = 1;
        }
        if ( current >= pages )
        {
            next = false;
        }
        else
        {
            next = true;
        }
        if ( (current - 1) > 0 )
        {
            previous = true;
        }
        else
        {
            previous = false;
        }
        Vector<E> os = gets();
        return os;
    }

 //一开始获取的

    public Vector<E> gets()
    {
        if ( current * each < total )
        {
            end = current * each;
            start = end - each;
        }
        else
        {
            end = total;
            start = each * (pages - 1);
        }
        Vector<E> gets = new Vector<E>();
        for ( int i = start; i < end; i++ )
        {
            E o = v.get( i );
            gets.add( o );
        }
        return gets;
    }
}



 而对于按不同搜烦Q我们需要一个FormBeanQ一般的搜烦Q都是模p搜索,搜烦个大概,而且输入的信息中文的比重也会很大Q所以,我把对中文字W的转换攑ֈ了这个BEAN里,在进行select * from * where likeq样的查询时Q如果是like ''q样可以得到所有的记录了,我便用这个来对付没有输入查询关键字的情况Q而like '%*%'可以匚w关键字,?%也在q里d上了Q?br />
package com.boya.subject.view;

import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class SearchForm extends ActionForm
{
    private static final long serialVersionUID = 1L;
    private String key;
    private String from;

    public String getFrom()
    {
        return from;
    }

    public void setFrom( String from )
    {
        this.from = from;
    }

      public void reset( ActionMapping mapping, HttpServletRequest req )
    {
        this.key = null;
    }

    public String getKey()
    {
        return key;
    }

    public void setKey( String key )
    {
        try
        {
            key = new String( key.getBytes( "iso-8859-1" ), "gb2312" );
        }
        catch ( UnsupportedEncodingException e )
        {
            e.printStackTrace();
        }
        this.key = "%" + key + "%";
    }
   
    public String getAny(){
        return "%%";
    }
}
前期都做好了Q我现在p开始访问这个Action了,可是q个控制器还没写呢!q里是代?/font>

public class AdminUserAction extends AdminAction
{
    private Vector<Student> ss; //用来装结果的容器
    private Page<Student> ps;
//分页昄的PAGE对象

    protected ActionForward executeAction( ActionMapping mapping,
            ActionForm form, HttpServletRequest req, HttpServletResponse res )
            throws Exception
    {
        if ( !isSupper( req ) )
        {
            return notSupper( res );//如果不是񔽎理员怎么办?
        }
        Service service = getService();//获取业务逻辑
        SearchForm sf = (SearchForm) form;//获取搜烦FORM
        String op = req.getParameter( "op" );//获取用户寚w面的操作
        String search = req.getParameter( "search" );//是否执行了搜?/font>
        Vector<Student> temp = null; //用于存放临时反馈l用Ll果容器
                if ( op == null )//如果用户没有执行?下一늚操作
                {
                    if ( search != null )//用户如果执行了搜?br />                    {
                        if ( sf.getFrom().equalsIgnoreCase( "class" ) )//如果是按班查找
                        {
                            ss = service.getAllStudentBySchoolClassForAdmin( sf
                                    .getKey() );//获取from的关键字
                        }
                        else if ( sf.getFrom().equalsIgnoreCase( "name" ) )//如果是按姓名查找
                        {
                            ss = service.getAllStudentByNameForAdmin( sf
                                    .getKey() );
                        }
                        else if ( sf.getFrom().equalsIgnoreCase( "user" ) )//如果是按用户名查?/font>
                        {
                            ss = service.getAllStudentByUserForAdmin( sf
                                    .getKey() );
                        }
                        else
                        {
                            ss = service.getAllStudentBySnForAdmin( sf.getKey() );//按学h?/font>
                        }
                        form.reset( mapping, req );//重置搜烦表单
                    }
                    else
                    {
                        ss = service.getAllStudentForAdmin( sf.getAny() ); //用户未执行查扑ְ昄全部Q?/font>
                    }
                    if ( ss != null && ss.size() != 0 )//如果查找不ؓI,有记录,那就创徏一个分对?/font>
                    {
                        ps = new Page<Student>( ss, 10 );//查询结果和每页昄记录C为参数构件对?/font>
                        temp = ps.gets();//q获取第一?/font>
                    }
                }
                else//如果用户执行了操?/font>
                {
                    if ( op.equals( "next" ) )//操作是下一?/font>
                    {
                        temp = ps.getNextPage();
                    }
                    if ( op.equals( "previous" ) )//操作是上一?/font>
                    {
                        temp = ps.getPreviouspage();
                    }
                }
                req.setAttribute( "search", SelectUtil.studentSearch() );//把搜索用到的表单攑ֈrequest?/font>
                req.setAttribute( "students", temp );//该页昄的学?/font>
                req.setAttribute( "page", ps );//分页对象
                return mapping.findForward( "student" );//h转发
    }
}


用到SelectUtil中的代码如下Q?br />/**
     * 获取学生查找cd的select
     * @return 学生查找cd
     * 2006-5-17 9:06:12
     */
    public static Vector<LabelValueBean> studentSearch()
    {
        Vector<LabelValueBean> s = new Vector<LabelValueBean>();
        s.add( new LabelValueBean( "按学h?, "sn" ) );
        s.add( new LabelValueBean( "按班U查?, "class" ) );
        s.add( new LabelValueBean( "按姓名查?, "name" ) );
        s.add( new LabelValueBean( "按用h?, "user" ) );
        return s;
    }
在看面视图前先让我们看看Model吧,

public class Student extends User
{
    private String sn;
    private SchoolClass schoolClass;
//q里的班U做Z一U对象,我们在视图显C的时候就有了一层嵌?/font>

    public SchoolClass getSchoolClass()
    {
        return schoolClass;
    }

    public void setSchoolClass( SchoolClass schoolClass )
    {
        this.schoolClass = schoolClass;
    }

    public String getSn()
    {
        return sn;
    }

    public void setSn( String sn )
    {
        this.sn = sn;
    }

    public String getType()
    {
        return "student";
    }
}
在了解了model后,q是看看视图吧,


先放个查询表单:

<html:javascript dynamicJavascript="true" staticJavascript="true" formName="SearchForm" />
<html:form action="/adminUser.do?search=true" onsubmit="return validateSearchForm(this)">

<html:select property="from" >
<html:options collection="search" property="value" labelProperty="label" />
</html:select>

<html:text property="key" size="16" maxlength="16"/>

<html:image src="images/search.gif"/>

</html:form>

׃模型中有嵌套Q那么我们就用到Nested标签Q其实没有嵌套也可以使用q个标签Q下面的是用于显CZ息的Q用q迨器进行遍历request范围的studentsQ你不安排范_他会自动扑ֈ的,q把每次遍历的对象v名叫studentQƈ作ؓ层次的根元素Q?/font>

<logic:iterate id="student" name="students">

<nested:root name="student">

<nested:nest property="schoolClass"><nested:write property="schoolClass"/></nested:nest>//L了student的schoolClass属性对象的schoolClass嵌套

<nested:write property="name"/>      //student的名?/font>

<nested:link page="/adminActions.do?method=deleteStudent" paramId="id" paramProperty="id" onclick="return window.confirm('您真的要删除吗?')">删除</nested:link>

</nested:root>

q里是显C分对象的Q?/font>

W?lt;bean:write name="page" property="current" />?br />?lt;bean:write name="page" property="pages" />?br />        //上一|否存?/font>
        <logic:equal name="page" property="previous" value="true">
               <html:link page="/adminUser.do?part=student&op=previous">
                <font color="6795b4">上一?lt;/font>
               </html:link>&nbsp;&nbsp; 
        </logic:equal>
        <logic:notEqual name="page" property="previous" value="true">上一?amp;nbsp;&nbsp;  </logic:notEqual>
        
       //下一|否存?/font>
         <logic:equal name="page" property="next" value="true">
         <html:link page="/adminUser.do?part=student&op=next">
          <font color="6795b4">下一?lt;/font>
         </html:link>&nbsp;&nbsp;  </logic:equal>
        <logic:notEqual name="page" property="next" value="true">下一?amp;nbsp;&nbsp;  </logic:notEqual>
        

共有<bean:write name="page" property="total" />条数?br />
</logic:iterate>

到这里不知道您看明白了多,在我的这个JSP里几乎没有M的业务逻辑Q这L设计比把HTML和JAVA搀杂在一起好了很多?/font>



]]>
վ֩ģ壺 ѨƬ߹ۿͬѧ| Ůɫһ| | ѹһػƾþ| vaĻ| װ׹Ƶ| лGAYƬվWWW| ߹ۿվ| ۺAV| ƷѲ| ؼëƬѲ| ۺ뾫Ʒһ| jŮpƵ| Ůʮ·츾| һƬѿ| AVպAVþ| þþƷ˳| ˳վ߹ۿ| һaƵ| ߹ۿѹۿ| ޳AVƬ| 99reѾƷƵۿ| ƷרWEB | 18վƬѹۿ| ŷƵ߹ۿ| ƷƵƵѿ| 2022ھƷѸƵ| ޹Ʒlv| Ƭ߹ۿ| һ˿Ƶ| þĻƷѩ| ŷ޴Ƭ| һa| ޹Ʒ߹ۿ| ˹ۿëƬ| ƷžƷƵ| Ļ޾Ʒ| ߹ۿɫëƬ| һëƬëƬһëƬ| ޹ŷպƷһ| þþþAVרɫ|