锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
<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鎻忚堪鍦ㄦ暟鎹簱涓垱寤轟竴寮犺〃
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();
聽聽}
聽}聽
}
//get & set
}
public class Department //涓撲笟
{
聽private Integer id;
聽private Institute institute;//瀛﹂櫌灞炴?/font>
聽private String department;
聽聽聽//get & set
}
涓嬮潰灝辨槸閰嶇疆鏂囦歡浜嗭細
<hibernate-mapping>
聽<class name="subject.model.Institute">
聽聽聽聽聽聽<id name="id">
聽聽聽聽聽聽聽聽聽<generator class="increment"/>
聽聽聽聽聽聽聽</id>
聽聽聽聽聽聽<property name="institute"/>
聽</class>
<class name="subject.model.Department">
聽聽聽聽聽聽<id name="id">
聽聽聽聽聽聽聽聽聽<generator class="increment" />
聽聽聽聽聽聽</id>
聽聽聽聽聽聽<property name="department" />
聽聽聽聽聽聽
聽聽聽聽聽聽<many-to-one name="institute" class="subject.model.Institute"聽
聽聽聽聽聽聽聽聽聽聽column="instituteId" lazy="false"/>//澶氬涓錛宭azy="false"鏉ュ皢渚濊禆寤惰繜璁劇疆涓篺alse
聽聽聽</class>
聽
</hibernate-mapping>
鎵璋撲緷璧栧歡榪熷氨鏄錛屽鏋滄垜浠妸浠栬緗負true錛岄偅涔堟垜浠緱鍒扮殑department涓殑璇ュ睘鎬у垵濮嬪寲涓虹┖錛屽惁鍒欏氨鏈夎灞炴т簡錛?br />
2.緇ф壙
鍦ㄦ垜鐨勭郴緇熶腑錛屽瓨鍦ㄤ笁縐嶇敤鎴鳳紝綆$悊鍛樸佸鐢熴佹暀甯堬紝浠栦滑閮芥湁緇煎悎鐨勫睘鎬э紝涔熸湁涓х殑鍦版柟錛屽叿浣撶殑綾諱粙緇嶅涓嬶細
public abstract class User //鐖剁被鐢ㄦ埛
{
聽private Integer id;
聽private String user;
聽private String password;
聽private String name;
聽private String telphone;
聽//get & set
}
public class Student extends User//瀛︾敓
{
聽private SchoolClass schoolClass;
聽private String sn;
}
public class Teacher extends User//鏁欏笀
{
聽private String level;
聽private Boolean confirm;
}
public class Admin extends User//綆$悊鍛?/font>
{
聽private String grade;
}
鍦ㄦ暟鎹簱涓垜鎶婁笁縐嶈鑹茬殑瀵硅薄瀛樻斁鍦ㄤ竴涓〃涓紝鐢ㄤ竴涓瓧孌墊潵鍖哄垎涓夌瑙掕壊錛屽湪hibernate鏄犲皠緇ф壙鏃跺睘浜庝竴縐嶆儏鍐碉紝鍙互鍙傜収涔︿腑鐨勪粙緇嶏細
<hibernate-mapping>
聽<class name="subject.model.User" discriminator-value="not null"> //榪欓噷鐨刵ot null寰堝叧閿紝娌¤繖涓氨浼氬嚭鐜伴棶棰?/font>
聽聽<id name="id">
聽聽聽<generator class="increment" />
聽聽</id>
聽聽
聽聽<discriminator column="type" type="character" />
聽聽
聽聽<property name="user" />
聽聽<property name="password" />
聽聽<property name="name" />
聽聽<property name="telphone" />
聽聽<subclass name="subject.model.Admin" discriminator-value="a">//瀛樺偍瀵硅薄綾誨瀷鐨勬爣璇嗙
聽聽聽<property name="grade" column="sn" />//瀵逛簬姣忕瀵硅薄鐨勫瓧孌甸兘鏀懼埌鏁版嵁搴撶殑涓鍒楅噷浜?/font>
聽聽</subclass>
聽聽
聽聽<subclass name="subject.model.Teacher" discriminator-value="t">
聽聽聽<property name="level" column="sn" />
聽聽聽<property name="confirm" column="about" />
聽聽</subclass>
聽聽
聽聽<subclass name="subject.model.Student" discriminator-value="s">
聽聽聽
聽聽聽<property name="sn" />
聽聽聽
聽聽聽<many-to-one name="schoolClass" class="subject.model.SchoolClass"
聽聽聽聽column="about" lazy="false"/>
聽聽聽聽
聽聽</subclass>
聽</class>
</hibernate-mapping>
package subject.bean;
import java.util.ArrayList;
import java.util.List;
public class Page
{
聽private int current = 1;聽//褰撳墠欏電爜
聽private int nextPage = 0;聽//涓嬩竴欏電爜
聽private int previousPage = 0;//涓婁竴欏電爜
聽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 List list = null;
//闇瑕佹樉紺虹殑鏁版嵁
聽public Page( List list, int each )//浠ラ渶瑕佹樉紺虹殑鏁版嵁鍜屾瘡欏佃鏄劇ず鐨勬暟鎹負鍙傛暟榪涜鍒濆鍖?/font>
聽{
聽聽this.list = list;
聽聽this.each = each;
聽聽total = list.size();//鎬葷殑鏁版嵁絳変簬List鐨勫ぇ灝?/font>
聽聽if ( total % each == 0 )//鎬婚〉鏁板拰娌¢〉鏄劇ず鐨勬暟鎹彲浠ユ暣闄わ紝鍒欎負鎬婚〉鏁?/font>
聽聽聽pages = total / each;
聽聽else
聽聽聽pages = total / each + 1;//鍚﹀垯灝遍渶瑕佸姞涓婁竴欏典簡
聽聽if ( current >= pages )
聽聽{
聽聽聽next = false;//鍒ゆ柇鏄惁鏈変笅涓欏?/font>
聽聽}
聽聽else
聽聽{
聽聽聽next = true;
聽聽聽nextPage = current + 1;//鏈夛紝榪樺緱綆楀嚭鏉ヤ笅涓欏墊槸澶氬皯鍛紒
聽聽}
聽聽if ( total < each )
聽聽{
聽聽聽start = 0;//榪欓〉鏄劇ず澶氬皯鏁版嵁鍟婏紵濡傛灉鏄渶鍚庝竴欏碉紝鍙樉紺烘暣闄ゅ悗鐨勪綑鏁頒簡
聽聽聽end = total;
聽聽}
聽聽else
聽聽{
聽聽聽start = 0;//鍚﹀垯瑕佹樉紺烘瘡欏甸渶瑕佹樉紺虹殑鏁版嵁鏁?/font>
聽聽聽end = each;
聽聽}
聽}
聽public int getCurrent()
聽{
聽聽return current;
聽}
聽public boolean isNext()
聽{
聽聽return next;
聽}
聽public boolean isPrevious()
聽{
聽聽return previous;
聽}
聽public int getPages()
聽{
聽聽return pages;
聽}
聽public int getTotal()
聽{
聽聽return total;
聽}
聽public int getNextPage()
聽{
聽聽return nextPage;
聽}
聽public int getPreviousPage()
聽{
聽聽return previousPage;
聽}
聽@SuppressWarnings ( "unchecked" )
聽public List get( int page )//鑾峰彇鎸囧畾欏電爜鐨凩ist
聽{
聽聽if ( page > 0 && page <= pages )
聽聽{
聽聽聽current = page;//page鍦ㄦ湁鏁堣寖鍥村唴鍒欎負褰撳墠欏?/font>
聽聽}
聽聽if ( ( current - 1 ) > 0 )//璁$畻涓婁竴欏墊槸鍚﹀瓨鍦ㄤ互鍙婂?/font>
聽聽{
聽聽聽previous = true;
聽聽聽previousPage = current - 1;
聽聽}
聽聽else
聽聽{
聽聽聽previous = false;
聽聽}
聽聽if ( current >= pages )//璁$畻涓嬩竴欏墊槸鍚﹀瓨鍦ㄤ互鍙婂?/font>
聽聽{
聽聽聽next = false;
聽聽}
聽聽else
聽聽{
聽聽聽next = true;
聽聽聽nextPage = current + 1;
聽聽}
聽聽if ( page * each < total )//璁$畻鏄劇ず鐨勮褰曞湪List涓殑浣嶇疆
聽聽{
聽聽聽end = current * each;
聽聽聽start = end - each;
聽聽}
聽聽else
聽聽{
聽聽聽end = total;
聽聽聽start = each * ( pages - 1 );
聽聽}
聽聽List gets = new ArrayList();//鎶婃樉紺虹殑鏁版嵁鏀懼埌涓涓柊鐨凩ist閲?/font>
聽聽for ( int i = start; i < end; i++ )
聽聽{
聽聽聽gets.add( list.get( i ) );
聽聽}
聽聽return gets;
聽}
}
涓婇潰鐨凱age Bean姣旈偅涓氨綆鐣ョ殑寰堝錛屾垜浠啀鏉ョ湅鐪婣ction鎬庝箞鏉ュ仛錛?br />
public class AdminAction extends BaseAction
{
聽private AdminManager mgr;
聽public void setAdminManager( AdminManager mgr )
聽{
聽聽this.mgr = mgr;
聽}
public ActionForward execute( ActionMapping mapping, ActionForm form,
聽聽聽HttpServletRequest request, HttpServletResponse response )
聽聽聽throws Exception
聽{
聽聽Integer pageId = getInt( request, "page" );
聽聽Page page = null;
聽聽List rs =mgr.getStudents();
聽聽聽if ( rs != null && rs.size() != 0 )
聽聽聽{
聽聽聽聽page = new Page( rs, 10 );
聽聽聽聽request.setAttribute( "students", page.get( pageId ) );
聽聽聽}
聽聽聽request.setAttribute( "search", Select.studentSearch() );
聽聽}聽聽
聽聽request.setAttribute( "page", page );
聽聽return mapping.findForward("student");
聽}
}
榪欐牱鎴戜滑灝卞彲浠ユ妸鍒嗛〉瀵硅薄鍜孡ist鏀懼埌Execute涓簡錛屽湪榪欓噷鎴戜滑鎶婁笟鍔¢昏緫瀵硅薄AdminManager鐨勫疄渚媘gr澹版槑鎴愪簡bean鐨勫艦寮忥紝榪欐牱鍙互鍦⊿pring涓埄鐢╥oc鏉ユ敞鍏ワ細
Struts鐨勫0鏄庯細
<action path="/admin" type="org.springframework.web.struts.DelegatingActionProxy" />
Spring涓殑澹版槑錛?br />
<!-- 涓氬姟閫昏緫 -->
聽<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
聽聽<property name="transactionManager" ref="transactionManager" />
聽聽<property name="transactionAttributes">
聽聽聽<props>
聽聽聽聽<prop key="save*">PROPAGATION_REQUIRED</prop>
聽聽聽聽<prop key="remove*">PROPAGATION_REQUIRED</prop>
聽聽聽聽<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
聽聽聽</props>
聽聽</property>
聽</bean>
聽<bean id="adminManager" parent="txProxyTemplate">
聽聽<property name="target">
聽聽聽<bean class="subject.service.impl.AdminManagerImpl">
聽聽聽聽<property name="dao" ref="dao" />
聽聽聽</bean>
聽聽</property>
聽</bean>
<bean name="/admin/admin" class="subject.web.action.AdminAction" singleton="false">
聽聽<property name="adminManager">
聽聽聽<ref bean="adminManager" />
聽聽</property>
聽</bean>
浠庤屽疄鐜頒簡Struts鍜孲pring鐨勫畬緹庢殗鎺ワ紝singleton="false"浠庤屽彲浠ヨВ鍐沖崟渚嬬殑璇熺梾錛?/font>
鍦╩odel閲?鎴戜滑閲囩敤浜嗙戶鎵垮叧緋?
鐖剁被user:
package subject.model;
public abstract class User extends BaseObject
{
聽private Integer id;
聽private String user;
聽private String password;
聽private String name;
聽private String telphone;
//set and get method聽
聽
聽public abstract String getType(); //榪欎釜鏄敤鏉ュ弽鏄犵敤鎴瘋鑹茬殑鍏抽敭鍑芥暟,鍦ㄥ瓙綾誨疄鐜?浠庤屽疄鐜板鎬?br />}
瀛愮被鐨勫疄鐜?
======================
package subject.model;
import subject.Constants;
public class Teacher extends User
{
聽private String level;聽聽聽聽聽聽聽聽 //鏁欏笀鐨勮亴縐?br />
//set and get method
聽public String getType()
聽{
聽聽return Constants.TEACHER;
聽}
}
================
package subject.model;
import subject.Constants;
public class Student extends User
{
聽private static final long serialVersionUID = 1L;
聽private SchoolClass schoolClass;聽聽聽聽聽聽聽聽 //瀛︾敓鐨勭彮綰?br />聽private String sn;聽聽聽聽聽聽聽聽聽聽聽聽 //瀛︾敓鐨勫鍙?/p>
//set and get method
聽
聽public String getType()
聽{
聽聽return Constants.STUDENT;
聽}
}
=================
package subject.model;
import subject.Constants;
public class Admin extends User
{
聽private String grade;聽聽聽聽聽聽聽聽聽聽 //綆$悊鍛樼殑綰у埆
//set and get method
聽public String getType()
聽{
聽聽return Constants.ADMIN;
聽}
}
瀵逛簬涓夎呮墍鍏辨湁鐨勫睘鎬у湪鏁版嵁搴撻噷,閮藉瓨鍦ㄤ竴涓瓧孌?鑰屼緷鎹笉鍚岀殑瑙掕壊鎷ユ湁涓嶅悓鐨勫惈涔?瀛︾敓鐨勭彮綰у垯瀛樻斁鍦ㄤ簡about閲?鍙瀛︾敓鏈夌彮綰?浠栧氨able,鍚﹀垯灝眅nable浜?鑰岀鐞嗗憳鍜屾暀甯堝垯榛樿涓?!
榪欑鏄睘浜庝竴涓戶鎵挎爲(wèi)瀛樻斁鍦ㄤ竴涓〃鐨勬儏鍐?Hibernate鐨勯厤緗涓?
<hibernate-mapping>
聽<class name="subject.model.User" discriminator-value="not null">
聽聽<id name="id">
聽聽聽<generator class="increment" />
聽聽</id>
聽聽
聽聽<discriminator column="type" type="character" />
聽聽
聽聽<property name="user" />
聽聽<property name="password" />
聽聽<property name="name" />
聽聽<property name="telphone" />
聽聽<subclass name="subject.model.Admin" discriminator-value="a">
聽聽聽<property name="grade" column="sn" />
聽聽</subclass>
聽聽
聽聽<subclass name="subject.model.Teacher" discriminator-value="t">
聽聽聽<property name="level" column="sn" />
聽聽</subclass>
聽聽
聽聽<subclass name="subject.model.Student" discriminator-value="s">
聽聽聽
聽聽聽<property name="sn" />
聽聽聽
聽聽聽<many-to-one name="schoolClass" class="subject.model.SchoolClass"
聽聽聽聽column="about" update="false" insert="false" />
聽聽聽聽
聽聽</subclass>
聽</class>
</hibernate-mapping>
=============================================
涓婇潰鐨勮繖浜涢兘鏄ā鍨嬬殑鍩虹,涓嬮潰鍐嶈鎬庝箞鏍烽厤鍚圫pring鍜孉cegi瀹炵幇緋葷粺鐨勫畨鍏ㄤ笌鐧婚檰
鍦⊿pring涓璈ibernate鐨勯厤緗彧浠嬬粛涓嶈鏄?
<!-- 瀹氫箟DBCP鏁版嵁婧?-->
聽<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
聽聽<property name="driverClassName" value="com.mysql.jdbc.Driver" />
聽聽<property name="url" value="jdbc:mysql://localhost/subject?useUnicode=true&characterEncoding=gbk" />
聽聽<property name="username" value="root" />
聽聽<property name="password" value="" />
聽聽<property name="maxActive" value="100" />
聽聽<property name="maxIdle" value="30" />
聽聽<property name="maxWait" value="1000" />
聽聽<property name="defaultAutoCommit" value="true" />
聽聽<property name="removeAbandoned" value="true" />
聽聽<property name="removeAbandonedTimeout" value="60" />
聽</bean>
聽<!-- Hibernate -->
聽<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
聽聽<property name="dataSource" ref="dataSource" />
聽聽<property name="mappingResources">
聽聽聽<list>
聽聽聽聽<value>subject/model/User.hbm.xml</value>
聽聽聽</list>
聽聽</property>
聽聽<property name="hibernateProperties">
聽聽聽<props>
聽聽聽聽<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
聽聽聽</props>
聽聽</property>
聽</bean>
聽<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
聽聽<property name="sessionFactory" ref="sessionFactory" />
聽</bean>
<!-- Dao瀵硅薄 -->
<bean id="userDao" class="subject.dao.hibernate.UserDaoImpl">
聽聽<property name="sessionFactory" ref="sessionFactory" />
聽</bean>
<!-- 涓氬姟閫昏緫 -->
聽<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
聽聽<property name="transactionManager" ref="transactionManager" />
聽聽<property name="transactionAttributes">
聽聽聽<props>
聽聽聽聽<prop key="save*">PROPAGATION_REQUIRED</prop>
聽聽聽聽<prop key="remove*">PROPAGATION_REQUIRED</prop>
聽聽聽聽<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
聽聽聽</props>
聽聽</property>
聽</bean>
<bean id="userManager" parent="txProxyTemplate">
聽聽<property name="target">
聽聽聽<bean class="subject.service.impl.UserManagerImpl">
聽聽聽聽<property name="userDao" ref="userDao" />
聽聽聽</bean>
聽聽</property>
聽</bean>
<!-- Struts -->
聽<bean name="/user" class="subject.web.action.UserAction" singleton="false">
聽聽<property name="userManager">
聽聽聽<ref bean="userManager" />
聽聽</property>
聽</bean>
==================
涓婇潰鍏蜂綋鐨勪笉鐢ㄤ簡瑙?鏃犻潪灝辨槸璋冪敤鍜屾暟鎹簱鐨勬搷浣?
涓嬮潰灝辮瀵笰cegi榪涜澹版槑浜?
鎴戜笉鐢–trl+c鍜孋trl+V鐨勬柟寮忓Acegi榪涜浠嬬粛,娌℃湁鎰忎箟,闅忎究google灝變竴澶у爢
鎴戜滑鎯充富瑕佸湪榪欐牱鐨勭郴緇熶腑闇瑕佺殑瀹夊叏絳栫暐閮芥湁鍝簺?
1.鐢ㄦ埛鐨勭櫥闄?br />2.闃叉澶氫釜鐢ㄦ埛鐧婚檰涓涓笎鍙?br />3.鐢ㄦ埛鐨勬敞閿
4.闃叉闈炴硶鐢ㄦ埛鐨勮闂?br />
鎴戣繖涓▼搴忔墍娑夊強鍒扮殑鍙湁榪欎簺,涓嬮潰灝辮繘琛岃鏄?
鍦╳eb.xml鐨勫0鏄?
<!-- Acegi瀹夊叏鎺у埗 Filter 閰嶇疆 -->
聽聽聽 <filter>
聽聽聽聽聽聽聽 <filter-name>securityFilter</filter-name>
聽聽聽聽聽聽聽 <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
聽聽聽聽聽聽聽 <init-param>
聽聽聽聽聽聽聽聽聽聽聽 <param-name>targetClass</param-name>
聽聽聽聽聽聽聽聽聽聽聽 <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
聽聽聽聽聽聽聽 </init-param>
聽聽聽 </filter>
聽聽聽
聽聽聽 <filter-mapping>
聽聽聽聽聽聽聽 <filter-name>securityFilter</filter-name>
聽聽聽聽聽聽聽 <url-pattern>/*</url-pattern>
聽聽聽 </filter-mapping>
Acegi閫氳繃瀹炵幇浜咶ilter鎺ュ彛鐨凢ilterToBeanProxy鎻愪緵涓縐嶇壒孌婄殑浣跨敤Servlet Filter鐨勬柟寮忥紝瀹冨鎵楽pring涓殑Bean -- FilterChainProxy鏉ュ畬鎴愯繃婊ゅ姛鑳斤紝榪欐牱灝辯畝鍖栦簡web.xml鐨勯厤緗紝騫朵笖鍒╃敤Spring IOC鐨勪紭鍔褲侳ilterChainProxy鍖呭惈浜嗗鐞嗚璇佽繃紼嬬殑filter鍒楄〃錛屾瘡涓猣ilter閮芥湁鍚勮嚜鐨勫姛鑳姐?br />
<!-- ======================== FILTER CHAIN ======================= -->
聽<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
聽聽<property name="filterInvocationDefinitionSource">
聽聽聽<value>
聽聽聽聽CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
聽聽聽聽PATTERN_TYPE_APACHE_ANT
聽聽聽聽
聽聽聽聽/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,
聽聽聽聽聽聽聽聽聽securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor
聽聽聽</value>
聽聽</property>
聽</bean>
澶т綋涓婂厛浠嬬粛涓涓?
httpSessionContextIntegrationFilter:姣忔request鍓?HttpSessionContextIntegrationFilter浠嶴ession涓幏鍙朅uthentication瀵硅薄錛屽湪request瀹屽悗, 鍙堟妸Authentication瀵硅薄淇濆瓨鍒癝ession涓緵涓嬫request浣跨敤,姝ilter蹇呴』鍏朵粬Acegi filter鍓嶄嬌鐢紝浣夸箣鑳借法瓚婂涓姹傘?br />logoutFilter:鐢ㄦ埛鐨勬敞閿
authenticationProcessingFilter:澶勭悊鐧婚檰璇鋒眰
exceptionTranslationFilter:寮傚父杞崲榪囨護鍣?br />filterInvocationInterceptor:鍦ㄨ闂墠榪涜鏉冮檺媯鏌?br />
榪欎簺灝辯姽濡傚湪web.xml澹版槑涓緋誨垪鐨勮繃婊ゅ櫒,涓嶈繃褰撴妸浠栦滑閮藉0鏄庡湪spring涓氨鍙互浜彈Spring緇欐垜浠甫鏉ョ殑鏂逛究浜嗐?br />
涓嬮潰灝辨槸瀵硅繖浜涜繃婊ゅ櫒鐨勫叿浣撳0鏄庯細
鍙鏈夌敤鐨勫湴鏂硅繘琛屽0鏄庯紝鍒殑鍦版柟鍑犱箮閮芥槸榛樿鐨?br /><!-- ======================== FILTER ======================= -->
聽<bean id="httpSessionContextIntegrationFilter"
聽聽class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />
聽<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
聽聽<constructor-arg value="/index.htm" />聽聽聽聽聽聽聽聽聽聽聽聽 紱誨紑鍚庢墍杞悜鐨勪綅緗?br />聽聽<constructor-arg>
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽 </constructor-arg>
聽聽<property name="filterProcessesUrl" value="/logout.htm" />聽聽聽聽聽聽聽 瀹氫箟鐢ㄦ埛娉ㄩ攢鐨勫湴鍧錛?br />聽</bean>
涓嬮潰鐨勮繖涓繃婊ゅ櫒錛屾垜浠牴鎹嚜宸辯殑闇姹傛湁浜嗚嚜宸辯殑瀹炵幇錛?/p>
聽<bean id="authenticationProcessingFilter" class="subject.web.filter.UserAuthenticationProcessingFilter">
聽聽<property name="authenticationManager" ref="authenticationManager"/>聽聽涓嬮潰浼氫粙緇嶇殑鐢ㄦ潵璧峰埌璁よ瘉綆$悊鐨勪綔鐢?br />聽聽<property name="authenticationFailureUrl" value="/login.htm?error=wrong"/>聽 鐧婚檰澶辮觸鐨勫湴鍧
聽聽<property name="defaultTargetUrl" value="/login.htm"/>聽聽聽聽聽聽 鐧婚檰鎴愬姛鐨勫湴鍧
聽聽<property name="filterProcessesUrl" value="/j_security_check"/>聽聽聽聽聽 鐧婚檰璇鋒眰鐨勫湴鍧
聽聽<property name="userManager" ref="userManager"/>聽聽聽聽聽聽聽 鑷繁娣誨姞鐨勫睘鎬э紝榪欐牱灝卞彲浠ヨ闂埌鎴戜滑鐨勪笟鍔¢昏緫
聽聽<property name="exceptionMappings">聽聽 鍑虹幇寮傚父鎵瀵瑰簲鐨勫湴鍧
聽聽聽聽聽聽聽聽聽聽聽 <value>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 org.acegisecurity.AuthenticationException=/login.htm?error=fail聽聽聽聽 鐧婚檰澶辮觸聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 org.acegisecurity.concurrent.ConcurrentLoginException=/login.htm?error=too聽聽聽聽聽聽聽 宸茬櫥闄嗕簡
聽聽聽聽聽聽聽聽聽聽聽 </value>
聽聽聽聽聽聽聽 </property>
聽</bean>
聽
聽<bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>
聽<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
聽聽<property name="authenticationEntryPoint">
聽聽聽<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
聽聽聽聽<property name="loginFormUrl" value="/login.htm?error=please"/>//濡傛灉鐢ㄦ埛娌$櫥闄嗗氨鎯寵闂紝鍏堝埌榪欓噷鐧婚檰鍚?br />聽聽聽聽<property name="forceHttps" value="false"/>
聽聽聽</bean>
聽聽</property>
聽</bean>
聽
聽<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
聽聽<property name="authenticationManager" ref="authenticationManager"/>聽聽聽聽聽聽聽璁よ瘉鏈嶅姟
聽聽<property name="accessDecisionManager">
聽聽聽<bean class="org.acegisecurity.vote.AffirmativeBased">
聽聽聽聽<property name="allowIfAllAbstainDecisions" value="false"/>
聽聽聽聽<property name="decisionVoters">
聽聽聽聽聽<list>
聽聽聽聽聽聽<bean class="org.acegisecurity.vote.RoleVoter">
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <property name="rolePrefix" value=""/>聽聽聽聽聽聽聽聽 //榪欓噷瀹氫箟鏁版嵁搴撲腑瀛樻斁鐨勮鑹插拰鎴戜滑鍦ㄨ繖閲屽0鏄庣殑瑙掕壊闂存槸鍚﹂渶瑕佸姞涓墠緙錛熸垜娌″姞
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </bean>
聽聽聽聽聽</list>
聽聽聽聽</property>
聽聽聽</bean>
聽聽</property>
聽聽<property name="objectDefinitionSource">
聽聽聽聽聽聽聽聽聽聽聽 <value>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 PATTERN_TYPE_APACHE_ANT
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /admin.htm*=a聽聽聽聽聽聽聽聽 榪欓噷灝辨槸鏁版嵁搴撲腑瀵瑰簲鐨則yep a
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /student*=s聽聽聽聽聽聽聽聽聽聽 鐢變簬娌℃湁鍓嶇紑鍜屾暟鎹簱閲屼竴鏍?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /teacher*=t
聽聽聽聽聽聽聽聽聽聽聽 </value>
聽聽聽聽聽聽聽 </property>
聽</bean>
聽
聽<bean id="loggerListener"
聽聽聽聽聽聽聽聽聽 class="org.acegisecurity.event.authentication.LoggerListener"/>聽聽聽聽聽聽 璁板綍浜嬩歡
涓嬮潰灝辮璇存槑鎴戜滑鐨勮璇佹湇鍔′簡錛屽叾璧峰埌鐨勫叧閿綔鐢ㄥ氨鏄敤鏉ヤ繚璇佺敤鎴風(fēng)櫥闄嗚韓浠界殑楠岃瘉錛?br />
瀹冨皢楠岃瘉鐨勫姛鑳藉鎵樼粰澶氫釜Provider錛屽茍閫氳繃閬嶅巻Providers, 浠ヤ繚璇佽幏鍙栦笉鍚屾潵婧愮殑韜喚璁よ瘉錛岃嫢鏌愪釜Provider鑳芥垚鍔熺‘璁ゅ綋鍓嶇敤鎴風(fēng)殑韜喚錛宎uthenticate()鏂規(guī)硶浼氳繑鍥炰竴涓畬鏁寸殑鍖呭惈鐢ㄦ埛鎺堟潈淇℃伅鐨凙uthentication瀵硅薄錛屽惁鍒欎細鎶涘嚭涓涓狝uthenticationException銆?br />
鍏堝0鏄庝竴涓鐞嗗櫒鍚э紝鍦ㄤ笂闈㈢殑榪囨護鍣ㄤ腑閮藉凡緇忕敤鍒拌繃浜?br /><!-- ======================== AUTHENTICATION ======================= -->
聽<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
聽聽<property name="providers">
聽聽聽<list>
聽聽聽聽<ref local="daoAuthenticationProvider" />聽聽聽鎴戜粎浠呯敤鍒?浠庢暟鎹簱涓鍙栫敤鎴蜂俊鎭獙璇佽韓浠?br />聽聽聽</list>
聽聽</property>
聽聽<property name="sessionController">
聽聽聽<bean id="concurrentSessionController"
聽聽聽聽class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">
聽聽聽聽<property name="maximumSessions">
聽聽聽聽聽<value>1</value>姣忎釜鐢ㄦ埛鍚屾椂鐧婚檰涓浣?br />聽聽聽聽</property>
聽聽聽聽<property name="sessionRegistry">
聽聽聽聽聽<bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl" />
聽聽聽聽</property>
聽聽聽聽<property name="exceptionIfMaximumExceeded" value="true" />
聽聽聽</bean>
聽聽</property>
聽</bean>
聽鏉ュ疄鐜板敮涓鐨勪竴涓狿rovider錛屼粠鏁版嵁搴撻獙璇佽韓浠?br />聽<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
聽聽<property name="userDetailsService">
聽聽聽<bean id="jdbcDaoImpl"
聽聽聽聽聽聽聽聽聽聽聽 class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
聽聽聽聽聽聽聽聽聽 <property name="dataSource" ref="dataSource"/>
聽聽聽聽聽聽聽聽聽 <property name="usersByUsernameQuery">
聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 select user,password,about from user where user = ?聽聽聽聽聽聽聽 鏌ユ壘鐢ㄦ埛鐨勬煡璇㈣鍙ワ紝鍙渶瑕佹妸浣犳暟鎹簱涓殑鐢ㄦ埛鍜屽瘑鐮佷互鍙奺nable鐩稿搴斾笂灝辮
聽聽聽聽聽聽聽聽聽聽聽聽聽 </value>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="authoritiesByUsernameQuery">
聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 select user,type from user where user = ?聽聽聽聽聽聽聽聽聽聽 榪欓噷灝辨槸鎶婄敤鎴峰拰鏉冮檺瀵瑰簲涓婏紝鍦╝ppfuse涓敤鐨勪袱涓〃錛屾垜閮芥斁涓涓〃閲屼簡錛屾墍浠ュ氨鐢ㄨ繖涓涓氨琛岄棶棰樼殑鍏抽敭鏄璁╁畠鑳芥壘鍒頒袱涓瓧孌碉紝鏋勬垚涓涓璞?br />聽聽聽聽聽聽聽聽聽聽聽聽聽 </value>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽 </bean>
聽聽</property>
聽聽<property name="userCache"> 緙撳瓨閮借繖涔堝啓錛?br />聽聽聽<bean class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
聽聽聽聽<property name="cache">
聽聽聽聽聽<bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
聽聽聽聽聽聽<property name="cacheManager">
聽聽聽聽聽聽聽<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
聽聽聽聽聽聽</property>
聽聽聽聽聽聽<property name="cacheName" value="userCache"/>
聽聽聽聽聽</bean>
聽聽聽聽</property>
聽聽聽</bean>
聽聽</property>
聽</bean>
==============
瀵逛簬涓婇潰鐧婚檰璇鋒眰鐨勫鐞嗗櫒鎴戝熼壌浜唖pringSide錛屽疄鐜扮殑鏂規(guī)硶濡備笅錛?br />package subject.web.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.acegisecurity.Authentication;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
import org.acegisecurity.ui.webapp.AuthenticationProcessingFilter;
import org.acegisecurity.userdetails.UserDetails;
import subject.Constants;
import subject.model.User;
import subject.service.UserManager;
public class UserAuthenticationProcessingFilter extends
聽聽AuthenticationProcessingFilter
{
聽private UserManager userManager;
聽public void setUserManager( UserManager userManager )
聽{
聽聽this.userManager = userManager;
聽}
聽protected boolean requiresAuthentication( HttpServletRequest request ,
聽聽聽HttpServletResponse response )
聽{
聽聽boolean requiresAuth = super.requiresAuthentication( request, response );
聽聽HttpSession httpSession = null;
聽聽try
聽聽{
聽聽聽httpSession = request.getSession( false );
聽聽}
聽聽catch ( IllegalStateException ignored )
聽聽{
聽聽}
聽聽if ( httpSession != null )
聽聽{
聽聽聽if ( httpSession.getAttribute( Constants.USER ) == null )
聽聽聽{
聽聽聽聽if ( !requiresAuth )
聽聽聽聽{
聽聽聽聽聽SecurityContext sc = SecurityContextHolder.getContext();
聽聽聽聽聽Authentication auth = sc.getAuthentication();
聽聽聽聽聽if ( auth != null
聽聽聽聽聽聽聽&& auth.getPrincipal() instanceof UserDetails )
聽聽聽聽聽{
聽聽聽聽聽聽UserDetails ud = (UserDetails) auth.getPrincipal();//涓婇潰澹版槑鐨剆ql鏃犻潪灝辨槸瑕佸寘瑁呮垚榪欎釜瀵硅薄
聽聽聽聽聽聽User user = userManager.getUser( ud.getUsername() );浠庝笟鍔¢昏緫閲屾壘鍒扮敤鎴鳳紝鏀懼埌session閲?br />聽聽聽聽聽聽httpSession.setAttribute( Constants.USER, user );
聽聽聽聽聽}
聽聽聽聽}
聽聽聽}
聽聽}
聽聽return requiresAuth;
聽}
}
鍦ㄧ湅鐪嬫垜鐨刲ogin.htm鍦ㄧ櫥闄嗘垚鍔熸椂鏄庝箞宸ヤ綔鐨勫惂錛?br />public class UserAction extends BaseAction
{
聽private UserManager mgr;
聽public void setUserManager( UserManager mgr )
聽{
聽聽this.mgr = mgr;
聽}
聽public ActionForward login( ActionMapping mapping , ActionForm form ,
聽聽聽HttpServletRequest request , HttpServletResponse response )
聽聽聽throws Exception
聽{
聽聽User user = (User) getSessionObject( request, Constants.USER );
聽聽ActionMessages msg = new ActionMessages();
聽聽if ( user != null )
聽聽{
聽聽聽return new ActionForward(聽 user.getType() + ".htm", true );鎴愬姛灝卞幓type.htm
聽聽}
聽聽else
聽聽{
聽聽聽String error = getParameter( request, Constants.ERROR );
聽聽聽if ( error != null )瀵逛簬涓嶅悓鐨勯敊璇紝閮藉姞浠ユ彁紺?br />聽聽聽{
聽聽聽聽if ( error.equalsIgnoreCase( "wrong" ) )
聽聽聽聽聽msg.add( "msg", new ActionMessage( "fail.login.wrong" ) );
聽聽聽聽else if ( error.equalsIgnoreCase( "too" ) )
聽聽聽聽聽msg.add( "msg", new ActionMessage( "fail.login.too" ) );
聽聽聽聽else if ( error.equalsIgnoreCase( "fail" ) )
聽聽聽聽聽msg.add( "msg", new ActionMessage( "fail.login.fail" ) );
聽聽聽聽else
聽聽聽聽聽msg.add( "msg", new ActionMessage( "fail.login.please" ) );
聽聽聽}
聽聽聽else
聽聽聽聽msg.add( "msg", new ActionMessage( "fail.login.please" ) );
聽聽}
聽聽saveErrors( request, msg );
聽聽return mapping.findForward( "fail" );
聽}
}
褰撶劧錛孉cegi闇瑕佷粙緇嶇殑涓滆タ澶浜嗭紝鎴戝彧鎶婃垜榪欐璁や負鏈夊繀瑕佽В閲婄殑涓滆タ鍐欏湪浜嗕笂闈㈣澶у鏉ュ弬鑰冿紝浣滀負鑳絞oogle鍒扮殑涓滆タ錛屾瘮濡傚浜庤璇佺殑鏂瑰紡榪樻湁寰堝錛屾垜灝辨病鏈夎緇嗙殑浠嬬粛錛屽湪瀛︿範(fàn)Acegi榪囩▼涓紝鎶婂畠鑷甫鐨勪緥瀛愬紕娓呮寰堝叧閿紝甯屾湜澶у涓璧峰涔?fàn)涓璧峰叡鍕夛紒
import java.text.*;
import java.util.*;
public class ExpressionModel extends Observable
{
聽
聽private ArrayList<String> middle;
聽private ArrayList<String> right;
聽private String input, result;
聽public ExpressionModel()
聽{
聽聽middle = new ArrayList<String>();
聽聽right = new ArrayList<String>();
聽}
聽//鍒ゆ柇涓涓瓧絎︽槸涓嶆槸鎿嶄綔絎?br />聽private boolean isOperator( String op )
聽{
聽聽if( op.equals("+") || op.equals("-") || op.equals("%")
聽聽聽聽 ||op.equals("*")|| op.equals("/") || op.equals("(")
聽聽聽聽 ||op.equals(")") )
聽聽聽 return true;
聽聽聽
聽聽else return false;
聽}
聽//寰楀埌涓涓搷浣滅鐨勪紭鍏堢駭
聽private int priority( String op )
聽{
聽聽if( op.equals("+") || op.equals("-") || op.equals("(") )
聽聽聽return 1;
聽聽else if( op.equals("*") || op.equals("/") || op.equals("%") )
聽聽聽return 2;
聽聽else
聽聽聽return 0;
聽}
聽
//璁$畻涓や釜鏁板拰涓涓繍綆楃寰楀埌鐨勭粨鏋?br />聽private String calTwoNumber( String op, String a, String b ) throws Exception
聽{
聽聽double x = Double.parseDouble( b );
聽聽double y = Double.parseDouble( a );
聽聽double z = 0;
聽聽
聽聽if( op.equals("+") )
聽聽聽z = x + y;
聽聽else if( op.equals("-") )
聽聽聽z = x - y;
聽聽else if( op.equals("*") )
聽聽聽z = x * y;
聽聽else if( op.equals("/") )
聽聽聽z = x / y;
聽聽else if( op.equals("%") )
聽聽聽z = x % y;
聽聽else
聽聽聽z=0;
聽聽
聽聽return Double.toString( z );
聽}
聽
//灝嗘垜浠緭鍏ョ殑涓垯琛ㄨ揪寮忚漿鎹㈡垚閫嗘嘗鍏板紡
聽private void turnToRight()
聽{
聽聽MyStack stack = new MyStack();
聽聽String op;
聽聽int pos = 0;
聽聽
聽聽StringTokenizer st = new StringTokenizer(input,"+-*/%()",true);
聽聽
聽聽while( st.hasMoreElements() )
聽聽聽middle.add( st.nextToken() );
聽聽
聽聽while(true)
聽聽{
聽聽聽if( isOperator( middle.get(pos) ) )
聽聽聽{
聽聽聽聽if( stack.getTop() == -1 || (middle.get(pos)).equals("(") )
聽聽聽聽{
聽聽聽聽聽stack.push( middle.get(pos) );
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽if( (middle.get(pos)).equals(")") )
聽聽聽聽聽{
聽聽聽聽聽聽if( !(stack.top()).equals("(") )
聽聽聽聽聽聽{
聽聽聽聽聽聽聽op = stack.pop();
聽聽聽聽聽聽聽right.add(op);
聽聽聽聽聽聽}
聽聽聽聽聽}
聽聽聽聽聽else
聽聽聽聽聽{
聽聽聽聽聽聽if( priority(middle.get(pos)) <= priority(stack.top()) && stack.getTop() != -1 )
聽聽聽聽聽聽{
聽聽聽聽聽聽聽op = stack.pop();
聽聽聽聽聽聽聽if( !op.equals("(") )
聽聽聽聽聽聽聽聽right.add(op);
聽聽聽聽聽聽}
聽聽聽聽聽聽stack.push( middle.get(pos) );
聽聽聽聽聽}
聽聽聽聽}
聽聽聽}
聽聽聽else
聽聽聽聽right.add( middle.get(pos) );
聽聽聽pos++;
聽聽聽if( pos >= middle.size() )
聽聽聽聽break;
聽聽}
聽聽
聽聽while( stack.getTop() != -1 )
聽聽{
聽聽聽op = stack.pop();
聽聽聽right.add(op);
聽聽}
聽}
聽private void calculate( String expression ) throws Exception
聽{
聽聽input = expression;
聽聽
聽聽turnToRight();
聽聽
聽聽MyStack stack = new MyStack();
聽聽String op1, op2, is = null;
聽聽Iterator<String> it = right.iterator();
聽聽
聽聽while(it.hasNext())
聽聽{
聽聽聽is = it.next();
聽聽聽if( isOperator(is) )
聽聽聽{
聽聽聽聽op1 = stack.pop();
聽聽聽聽op2 = stack.pop();
聽聽聽聽stack.push( calTwoNumber(is,op1,op2) );
聽聽聽}
聽聽聽else stack.push(is);
聽聽}
聽聽
聽聽NumberFormat form = NumberFormat.getInstance();
聽聽form.setMaximumFractionDigits(5);
聽聽
聽聽result = input + "=" + form.format( Double.parseDouble( stack.pop() ) );
聽聽
聽聽setChanged();
聽聽notifyObservers();
聽}
聽
聽public void input(String expression) throws Exception
聽{
聽聽calculate(expression);
聽聽middle.clear();
聽聽right.clear();
聽}
聽
聽public String getResult(){
聽聽return result;
聽}
聽
}
===============MyStack==============
//鎴戜滑鐢ㄥ埌鐨勮嚜宸辯殑鍫嗘爤
package expression;
import java.util.*;
public class MyStack
{
聽
聽private LinkedList<String> list;
聽private int top;
聽
聽public MyStack()
聽{
聽聽list = new LinkedList<String>();
聽聽top = -1;
聽}
聽聽
聽public void push(String value)
聽{
聽聽top++;
聽聽list.addFirst(value);
聽}
聽
聽public String pop()
聽{
聽聽String temp = list.getFirst();
聽聽top--;
聽聽list.removeFirst();
聽聽return temp;
聽}
聽
聽public String top()
聽{
聽聽return list.getFirst();
聽}
聽
聽public int getTop()
聽{
聽聽return top;
聽}
聽
}
===============ExpressionController========------
//鎺у埗鍣ㄧ粍浠訛紝鍖呮嫭涓涓緭鍏ュ煙鍜屼袱涓寜綰?br />
package expression;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ExpressionController extends JPanel
{
聽
聽private ExpressionModel expressionModel;聽聽
聽private JTextField calTextField;
聽
聽public ExpressionController( ExpressionModel controllerModel ) {
聽聽
聽聽super();
聽聽
聽聽expressionModel = controllerModel;
聽聽
聽聽calTextField = new JTextField( 15 );
聽聽JButton calButton = new JButton( "璁$畻" );
聽聽JButton delButton = new JButton( "鍙栨秷" );
聽聽
聽聽calButton.addActionListener(
聽聽聽new ActionListener()
聽聽聽{
聽聽聽聽public void actionPerformed( ActionEvent event )
聽聽聽聽{
聽聽聽聽聽try
聽聽聽聽聽{
聽聽聽聽聽聽expressionModel.input( calTextField.getText() );
聽聽聽聽聽聽calTextField.setText("");
聽聽聽聽聽}
聽聽聽聽聽catch ( Exception exception )
聽聽聽聽聽{
聽聽聽聽聽聽JOptionPane.showMessageDialog (
聽聽聽聽聽聽聽ExpressionController.this,
聽聽聽聽聽聽聽"璇瘋緭鍏ユ湁鏁堣〃杈懼紡錛?, "閿欒",
聽聽聽聽聽聽聽JOptionPane.ERROR_MESSAGE );
聽聽聽聽聽聽calTextField.setText("");
聽聽聽聽聽}
聽聽聽聽}
聽聽聽}
聽聽);
聽聽
聽聽delButton.addActionListener(
聽聽聽new ActionListener()
聽聽聽{
聽聽聽聽public void actionPerformed( ActionEvent event )
聽聽聽聽{
聽聽聽聽聽try
聽聽聽聽聽{
聽聽聽聽聽聽calTextField.setText("");
聽聽聽聽聽}
聽聽聽聽聽catch ( Exception exception )
聽聽聽聽聽{
聽聽聽聽聽聽calTextField.setText("");
聽聽聽聽聽}
聽聽聽聽}
聽聽聽}
聽聽);
聽聽
聽聽setLayout( new FlowLayout() );
聽聽
聽聽add( calTextField );
聽聽add( calButton );
聽聽add( delButton );
聽
聽}
聽
聽public Dimension getPreferredSize()
聽{
聽聽return new Dimension( 320, 40 );
聽}
聽
聽public Dimension getMinimumSize()
聽{
聽聽return getPreferredSize();
聽}
聽
聽public Dimension getMaximumSize()
聽{
聽聽return getPreferredSize();
聽}
聽
}
================ExpressionView ==================
//鐢ㄦ潵鏄劇ず緇撴灉鐨勮鍥?br />package expression;
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
public class ExpressionView extends JPanel implements Observer
{
聽
聽private ExpressionModel expressionModel;
聽private JLabel display = new JLabel();
聽
聽public ExpressionView( ExpressionModel model ) {
聽聽
聽聽if( model == null )
聽聽聽throw new NullPointerException();
聽聽
聽聽expressionModel = model;
聽聽expressionModel.addObserver( this );
聽聽
聽聽add( display );
聽聽
聽聽setBackground( Color.white );
聽聽setBorder( new MatteBorder( 1, 1, 1, 1, Color.black ) );
聽聽
聽}
聽
聽public void update( Observable observable, Object object )
聽{
聽聽display.setText( expressionModel.getResult() );
聽}
聽
聽public Dimension getPreferredSize()
聽{
聽聽return new Dimension( 320, 60 );
聽}
聽
聽public Dimension getMinimumSize()
聽{
聽聽return getPreferredSize();
聽}
聽
聽public Dimension getMaximumSize()
聽{
聽聽return getPreferredSize();
聽}
聽
聽
}
===================Expression=====================
//鏈鍚庢妸榪欎簺緇勮鍒拌繖閲屽惂
package expression;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class Expression extends JApplet
{
聽聽
聽public void init()
聽{
聽聽ExpressionModel model = new ExpressionModel();
聽聽ExpressionView view = new ExpressionView( model );
聽聽ExpressionController controller = new ExpressionController( model );
聽聽
聽聽Container contentPane = getContentPane();
聽聽contentPane.add( view, BorderLayout.CENTER );
聽聽contentPane.add( controller, BorderLayout.SOUTH );
聽聽
聽聽setSize( 320, 100 );
聽聽
聽}
聽聽
}
鎶婅繖鍑犱釜綾繪墦鍖呭埌涓涓猨ar鏂囦歡鍚庯紝鍐嶅垱寤轟釜htm鏂囦歡鏉ヨ闂畠
<object
聽聽聽 classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
聽聽聽 codebase = "聽聽聽 WIDTH = 320 HEIGHT = 100 >
聽聽聽 <PARAM NAME = CODE VALUE = "expression.Expression" >
聽聽聽 <PARAM NAME = ARCHIVE VALUE = "expression.jar" >
聽聽聽 <param name = "type" value = "application/x-java-applet;version=1.5">
聽聽聽 <param name = "scriptable" value = "false">
</object>
榪欐牱灝辮浜嗭紝涓嶈繃浣犵殑鏈哄櫒闇瑕佸畨瑁卝re 5
聽<filter-mapping> <!-- https://urlrewrite.dev.java.net/manual/3.0 -->
聽聽聽聽聽聽聽 <filter-name>rewriteFilter</filter-name>
聽聽聽聽聽聽聽 <url-pattern>/*</url-pattern>
聽聽聽 </filter-mapping>
瀹冩墍搴旂敤鍒扮殑鍖呭瓨鏀懼湪lib涓嬬殑urlrewrite-3.0-beta.jar
瀹冨拰浠ヤ笂鐨勪袱閮ㄥ垎錛屼互鍙?web-inf/urlrewrite.xml鏋勬垚浜嗗url鍦板潃鐨勭編鍖?br />
鎵撳紑榪欎釜鏂囦歡錛屾垜浠彲浠ョ湅鍒頒互涓嬬殑澹版槑錛?br />
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
聽聽聽 "
<urlrewrite>
聽聽聽 <rule>
聽聽聽聽聽聽聽 <from>^/user/(.*).html$</from>
聽聽聽聽聽聽聽 <to type="forward">/editUser.html\?username=$1</to>
聽聽聽 </rule>
</urlrewrite>
榪欐牱緋葷粺灝卞畬鎴愪簡url鍦板潃鐨別ditUser.html?username=****鐨勭編鍖?br />
濡傚皢
http://localhost/aaa/bbb.jsp?id=99&name=abc
琛ㄧ幇涓猴細
http://localhost/aaa/bbb/99_abc.html
閰嶇疆濡備笅錛?
<rule>
<from>/aaa/bbb/([0-9]+)_([a-z]+).html</from>
<to>/../aaa/bbb.jsp?id=$1&name=$2</to>
</rule>
]]>
public class CheckTag extends TagSupport
{
聽聽聽 private static final long serialVersionUID = 879137944441282895L;
聽聽聽 private String check = "";//鐢ㄦ潵楠岃瘉鐨勫彉閲?/font>
聽聽聽 private String url = "index.jsp";//鍑虹幇閿欒瑕佸幓鐨勯〉闈?/font>
聽聽聽 private String msg = "";//閿欒鐨勬彁紺?/font>
聽聽聽 private String scope = "";//瑕佷弗鏁村彉閲忕殑鑼冨洿
聽聽聽 private String to = "go";
//濡傛灉楠岃瘉澶辮觸錛屾槸灝嗛〉闈㈠悗閫錛岃繕鏄畾浣嶅埌鍝噷錛?/font>
聽聽聽 public String getTo()
聽聽聽 {
聽聽聽聽聽聽聽 return to;
聽聽聽 }
聽聽聽 public void setTo( String to )
聽聽聽 {
聽聽聽聽聽聽聽 this.to = to;
聽聽聽 }
聽聽聽 public String getMsg()
聽聽聽 {
聽聽聽聽聽聽聽 return msg;
聽聽聽 }
聽聽聽 public void setMsg( String msg )
聽聽聽 {
聽聽聽聽聽聽聽 this.msg = msg;
聽聽聽 }
聽聽聽 public String getScope()
聽聽聽 {
聽聽聽聽聽聽聽 return scope;
聽聽聽 }
聽聽聽 public void setScope( String scope )
聽聽聽 {
聽聽聽聽聽聽聽 this.scope = scope;
聽聽聽 }
聽聽聽 public String getCheck()
聽聽聽 {
聽聽聽聽聽聽聽 return check;
聽聽聽 }
聽聽聽 public void setCheck( String check )
聽聽聽 {
聽聽聽聽聽聽聽 this.check = check;
聽聽聽 }
聽聽聽 public String getUrl()
聽聽聽 {
聽聽聽聽聽聽聽 return url;
聽聽聽 }
聽聽聽 public void setUrl( String url )
聽聽聽 {
聽聽聽聽聽聽聽 this.url = url;
聽聽聽 }
聽聽聽 public int doStsrtTag() throws JspException
聽聽聽 {
聽聽聽聽聽聽聽 return SKIP_BODY;
聽聽聽 }
聽聽聽 public int doEndTag() throws JspException
聽聽聽 {
聽聽聽聽聽聽聽 boolean valid = false;//鍏堣涓轟笉鍙敤
聽聽聽聽聽聽聽 if ( scope.equalsIgnoreCase( "request" ) )//濡傛灉瑕佹鏌equest鑼冨洿
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 valid = CheckUtil.checkRequestAttribute( pageContext.getRequest(),
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 check );
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 else if ( scope.equalsIgnoreCase( "session" ) )
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 valid = CheckUtil.checkSession( pageContext.getSession(), check );
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 else if ( scope.equalsIgnoreCase( "parameter" ) )
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 valid = CheckUtil.checkParameter( pageContext.getRequest(), check );
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 else if ( scope.equalsIgnoreCase( "application" ) )
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 valid = CheckUtil.checkApp( pageContext.getServletContext(), check );
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 if ( valid ) return EVAL_PAGE;//濡傛灉鍙敤灝辯戶緇墽琛屾欏電殑鍏朵綑閮ㄥ垎
聽聽聽聽聽聽聽 else
聽聽聽聽聽聽聽 {//鍚﹀垯錛屽搱鍝?/font>
聽聽聽聽聽聽聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if ( to.equalsIgnoreCase( "go" ) ) //鐜板湪澶辮觸浜嗭紝灝辯湅鎬庝箞鍥炲埌浣犺鍒扮殑鍦版柟
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 HtmlUtil.callParentGo(
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 pageContext.getOut(), msg, url );//灝嗘祻瑙堝櫒瀹氫綅鍒癠RL聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 HtmlUtil.callBack( pageContext.getOut(), msg );//鍚庨涓涓嬮〉闈㈡潵闃繪
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 return SKIP_PAGE;//璺寵繃欏甸潰鐨勫叾浣欓儴鍒嗭紝涓嶆墽琛?/font>
聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽 catch ( Exception e )
聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 throw new JspException( e.toString() );
聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 public void release()
聽聽聽 {
聽聽聽聽聽聽聽 super.release();
聽聽聽聽聽聽聽 check = "";
聽聽聽聽聽聽聽 url = "";
聽聽聽聽聽聽聽 msg = "";
聽聽聽聽聽聽聽 scope = "";
聽聽聽 }
}
涓嬮潰鏄敤鍒扮殑htmlUtil閮ㄥ垎錛?br />
public static void callParentGo( Writer out, String msg, String url )
聽聽聽聽聽聽聽聽聽聽聽 throws IOException
聽聽聽 {
聽聽聽聽聽聽聽 out.write( "<script language=\"javascript\">" );
聽聽聽聽聽聽聽 out.write( "alert(\"" + msg + "\");" );
聽聽聽聽聽聽聽 out.write( "parent.location.href=\"" + url + "\";" );
聽聽聽聽聽聽聽 out.write( "</script>" );
聽聽聽 }
public static void callBack( Writer out, String msg ) throws IOException
聽聽聽 {
聽聽聽聽聽聽聽 out.write( "<script language=\"javascript\">" );
聽聽聽聽聽聽聽 out.write( "alert(\"" + msg + "\");" );
聽聽聽聽聽聽聽 out.write( "parent.history.back();" );
聽聽聽聽聽聽聽 out.write( "</script>" );
聽聽聽 }
鍐欎釜check.tld閮ㄧ講鍚э紝
<?xml version = "1.0"?>
<taglib>
聽<tlibversion>1.0</tlibversion>
聽<jspversion>1.1</jspversion>
聽<tag>
聽聽<name>check</name>
聽聽<tag-class>com.boya.subject.util.CheckTag</tag-class>
聽聽<attribute>
聽聽聽<name>check</name>
聽聽聽<required>true</required>
聽聽</attribute>
聽聽<attribute>
聽聽聽<name>url</name>
聽聽聽<required>false</required>
聽聽</attribute>
聽聽<attribute>
聽聽聽<name>msg</name>
聽聽聽<required>true</required>
聽聽</attribute>
聽聽<attribute>
聽聽聽<name>scope</name>
聽聽聽<required>true</required>
聽聽</attribute>
聽聽<attribute>
聽聽聽<name>to</name>
聽聽聽<required>false</required>
聽聽</attribute>
聽</tag>
</taglib>
浣?/font>
鍙鍦ㄦ瘡涓〉闈㈤噷鍐欎笅榪欎釜灝卞彲浠ュ垽瀹氱敤鎴鋒槸鍚︾櫥闄嗕簡
<%@ taglib prefix="boya" uri="/WEB-INF/check.tld" %>
<boya:check check="admin" msg="綆$悊鍛樺皻鏈櫥闄嗭紝璇風(fēng)櫥闄嗭紒" scope ="session"/>
濡傛灉娌℃湁鐧婚檰閭d箞錛屼細鑷姩鎻愮ず鍒伴欏電櫥闄嗭紝涓嶉敊錛屽緢瀹岀編鍚э紵
褰撶劧涓嶆槸錛屾?zhèn)ㄥ彲浠ユ彁鍑烘?zhèn)ㄧ殑瑙佽В銆傘傘傘?/font>
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;聽聽聽
//瀛樻斁鏌ヨ緇撴灉鐨勫鍣?/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;
聽聽聽 }
}
聽鑰屽浜庢寜涓嶅悓鎼滅儲錛屾垜浠渶瑕佷竴涓狥ormBean錛屼竴鑸殑鎼滅儲錛岄兘鏄ā緋婃悳绱紝鎼滅儲涓ぇ姒傦紝鑰屼笖杈撳叆鐨勪俊鎭腑鏂囩殑姣旈噸涔熶細寰堝ぇ錛屾墍浠ワ紝鎴戞妸瀵逛腑鏂囧瓧絎︾殑杞崲鏀懼埌浜嗚繖涓狟EAN閲岋紝鍦ㄨ繘琛宻elect * from * where like榪欐牱鐨勬煡璇㈡椂錛屽鏋滄槸like ''榪欐牱灝卞彲浠ュ緱鍒版墍鏈夌殑璁板綍浜嗭紝鎴戜究鐢ㄨ繖涓潵瀵逛粯娌℃湁杈撳叆鏌ヨ鍏抽敭瀛楃殑鎯呭喌錛岃宭ike '%*%'鍙互鍖歸厤鍏抽敭瀛楋紝鑰?%涔熷湪榪欓噷娣誨姞涓婁簡錛?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 "%%";
聽聽聽 }
}
鍓嶆湡閮藉仛濂戒簡錛屾垜鐜板湪灝辮寮濮嬭闂繖涓狝ction浜嗭紝鍙槸榪欎釜鎺у埗鍣ㄨ繕娌″啓鍛紒榪欓噷鏄唬鐮?/font>
public class AdminUserAction extends AdminAction
{
聽聽聽 private Vector<Student> ss; //鐢ㄦ潵瑁呯粨鏋滅殑瀹瑰櫒
聽聽聽 private Page<Student> ps;
//鍒嗛〉鏄劇ず鐨凱AGE瀵硅薄
聽聽聽 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" );//鑾峰彇鐢ㄦ埛瀵歸〉闈㈢殑鎿嶄綔
聽聽聽聽聽聽聽 String search = req.getParameter( "search" );//鏄惁鎵ц浜嗘悳绱?/font>
聽聽聽聽聽聽聽 Vector<Student> temp = null;聽//鐢ㄤ簬瀛樻斁涓存椂鍙嶉緇欑敤鎴風(fēng)殑緇撴灉瀹瑰櫒
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 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() );//鎸夊鍙鋒煡鎵?/font>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 form.reset( mapping, req );//閲嶇疆鎼滅儲琛ㄥ崟
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ss = service.getAllStudentForAdmin( sf.getAny() ); //鐢ㄦ埛鏈墽琛屾煡鎵懼氨鏄劇ず鍏ㄩ儴錛?/font>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if ( ss != null && ss.size() != 0 )//濡傛灉鏌ユ壘涓嶄負絀猴紝鏈夎褰曪紝閭e氨鍒涘緩涓涓垎欏靛璞?/font>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ps = new Page<Student>( ss, 10 );//灝嗘煡璇㈢粨鏋滃拰姣忛〉鏄劇ず璁板綍鏁頒綔涓哄弬鏁版瀯浠跺璞?/font>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 temp = ps.gets();//騫惰幏鍙栫涓欏?/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" );//璇鋒眰杞彂
聽聽聽 }
}
鐢ㄥ埌SelectUtil涓殑浠g爜濡備笅錛?br />/**
聽聽聽聽 * 鑾峰彇瀛︾敓鏌ユ壘綾誨埆鐨剆elect
聽聽聽聽 * @return 瀛︾敓鏌ユ壘綾誨埆
聽聽聽聽 * 2006-5-17 9:06:12
聽聽聽聽 */
聽聽聽 public static Vector<LabelValueBean> studentSearch()
聽聽聽 {
聽聽聽聽聽聽聽 Vector<LabelValueBean> s = new Vector<LabelValueBean>();
聽聽聽聽聽聽聽 s.add( new LabelValueBean( "鎸夊鍙鋒煡鎵?, "sn" ) );
聽聽聽聽聽聽聽 s.add( new LabelValueBean( "鎸夌彮綰ф煡鎵?, "class" ) );
聽聽聽聽聽聽聽 s.add( new LabelValueBean( "鎸夊鍚嶆煡鎵?, "name" ) );
聽聽聽聽聽聽聽 s.add( new LabelValueBean( "鎸夌敤鎴鋒煡鎵?, "user" ) );
聽聽聽聽聽聽聽 return s;
聽聽聽 }
鍦ㄧ湅欏甸潰瑙嗗浘鍓嶅厛璁╂垜浠湅鐪婱odel鍚э紝
public class Student extends User
{
聽聽聽 private String sn;
聽聽聽 private SchoolClass schoolClass;
//榪欓噷鐨勭彮綰у仛涓轟簡涓縐嶅璞★紝鎴戜滑鍦ㄨ鍥炬樉紺虹殑鏃跺欏氨鏈変簡涓灞傚祵濂?/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";
聽聽聽 }
}
鍦ㄤ簡瑙d簡model鍚庯紝榪樻槸鐪嬬湅瑙嗗浘鍚э紝
鍏堟斁涓煡璇㈣〃鍗曪細
<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>
鐢變簬妯″瀷涓湁宓屽錛岄偅涔堟垜浠氨灝嗙敤鍒癗ested鏍囩錛屽叾瀹炴病鏈夊祵濂椾篃鍙互浣跨敤榪欎釜鏍囩錛屼笅闈㈢殑鏄敤浜庢樉紺轟俊鎭殑錛岀敤榪卡鍣ㄨ繘琛岄亶鍘唕equest鑼冨洿鐨剆tudents錛屼綘涓嶅畨鎺掕寖鍥達紝浠栦細鑷姩鎵懼埌鐨勶紝騫舵妸姣忔閬嶅巻鐨勫璞¤搗鍚嶅彨student錛屽茍浣滀負灞傛鐨勬牴鍏冪礌錛?/font>
<logic:iterate id="student" name="students">
<nested:root name="student">
<nested:nest property="schoolClass"><nested:write property="schoolClass"/></nested:nest>//瀵繪壘浜唖tudent鐨剆choolClass灞炴у璞$殑schoolClass宓屽
<nested:write property="name"/>聽聽聽聽聽 //student鐨勫悕瀛?/font>
<nested:link page="/adminActions.do?method=deleteStudent" paramId="id" paramProperty="id" onclick="return window.confirm('鎮(zhèn)ㄧ湡鐨勮鍒犻櫎鍚楋紵')">鍒犻櫎</nested:link>
</nested:root>
榪欓噷鏄樉紺哄垎欏靛璞$殑錛?/font>
絎?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> 聽
聽聽聽聽聽聽聽 </logic:equal>
聽聽聽聽聽聽聽聽<logic:notEqual name="page" property="previous" value="true">涓婁竴欏?amp;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> 聽 </logic:equal>
聽聽聽聽聽聽聽聽<logic:notEqual name="page" property="next" value="true">涓嬩竴欏?amp;nbsp; 聽 </logic:notEqual>
聽聽聽聽聽聽聽聽
鍏辨湁<bean:write name="page" property="total" />鏉℃暟鎹?br />
</logic:iterate>
鍒拌繖閲屼笉鐭ラ亾鎮(zhèn)ㄧ湅鏄庣櫧浜嗗灝戯紝鍦ㄦ垜鐨勮繖涓狫SP欏甸噷鍑犱箮娌℃湁浠諱綍鐨勪笟鍔¢昏緫錛岃繖鏍風(fēng)殑璁捐灝辨瘮鎶奌TML鍜孞AVA鎼鏉傚湪涓璧峰ソ浜嗗緢澶氥?/font>