用戶登陸的實(shí)現(xiàn)
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;
public class LoginForm extends ActionForm
{
private static final long serialVersionUID = 1L;
private String user = null;
private String password = null;
public String getPassword()
{
return password;
}
public void setPassword( String password )
{
this.password = password;
}
public String getUser()
{
return user;
}
public void setUser( String user )
{
this.user = user;
}
public void reset(ActionMapping mapping,HttpServletRequest request)
{
this.password = null;這里很重要,當(dāng)用戶輸入有錯時,需要返回登陸界面給用戶,為了用戶填寫方便我們可以設(shè)置返回給用戶的哪部分信息設(shè)置為空
}
}
我用來實(shí)現(xiàn)登陸的DispatchAction代碼如下:
public ActionForward login( ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res ) throws Exception
{
Service service = getService();調(diào)用業(yè)務(wù)邏輯
LoginForm loginForm = (LoginForm) form;獲取formbean
String user = loginForm.getUser();提取用戶名
Person person = service.getUser( user );從業(yè)務(wù)邏輯中查找用戶
ActionMessages messages = new ActionMessages();
ActionMessage am;
if ( person == null )假如用戶不存在,我們就返回
{
am = new ActionMessage( "index.jsp.fail.user", user );參數(shù)的意義:第一個是主串,而后面的作為arg數(shù)組
messages.add( "user", am );把錯誤信息放到errors 屬性為user那里去顯示
saveErrors( req, messages );
form.reset( mapping, req );假如出現(xiàn)錯誤,調(diào)用formbean的重置功能
return mapping.findForward( ID.FAIL );
}
if ( !person.getPassword().equals( loginForm.getPassword() ) )假如密碼不一致
{
am = new ActionMessage( "index.jsp.fail.password", user );
messages.add( "password", am );
saveErrors( req, messages );
form.reset( mapping, req );
return mapping.findForward( ID.FAIL );
}
setsessionObject( req, person.getType(), person );把用戶放到session里
return new ActionForward( person.getType() + ".do", true );我在每個類型用戶的類中加入了一個getType來在這里調(diào)用,之后動態(tài)的去對應(yīng)的admin.do,student.do,teacher.do的主頁面,并且這里實(shí)現(xiàn)的不是請求轉(zhuǎn)發(fā),而是請求從定向
}
為了讓大家更方便的了解我這個設(shè)計,我先把我的一些整體的規(guī)劃都說出來吧,由于我是初學(xué),難免會參照本書籍來看,我買的是那本孫某女的書《精通:*****》,看了看她前面的介紹,我一看了不得,能出書,寫的還都不錯,這女的可不得了,漸漸迷惑的地方非常多,比如例子里面注釋都拽上了英語,搞不懂,而當(dāng)我從網(wǎng)上下到電子盜版jakarta struts(我已安下栽說明要求的那樣在24小時后刪除了)這本書的時候我才恍然大悟,原來是抄襲啊?至于是誰抄的誰,口說無憑,不能亂誹謗,不過大家心里都該有桿稱!
下面就是代碼了:
package com.boya.subject.model;
public interface Person
{
public Long getId();
public void setId( Long id );
public String getName();
public void setName( String name );
public String getPassword();
public void setPassword( String password );
public String getTelphone();
public void setTelphone( String telphone );
public String getUser();
public void setUser( String user );
public String getType();
}
package com.boya.subject.model;
public abstract class User implements Person
{
private Long id;數(shù)據(jù)庫id
private String user;用戶名
private String password;密碼
private String name;姓名
private String telphone;電話
public Long getId()
{
return id;
}
public void setId( Long id )
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
public String getPassword()
{
return password;
}
public void setPassword( String password )
{
this.password = password;
}
public String getTelphone()
{
return telphone;
}
public void setTelphone( String telphone )
{
this.telphone = telphone;
}
public String getUser()
{
return user;
}
public void setUser( String user )
{
this.user = user;
}
}
package com.boya.subject.model;
public class Admin extends User
{
private String grade = null; 治理員權(quán)限
public String getGrade()
{
return grade;
}
public void setGrade( String grade )
{
this.grade = grade;
}
public String getType()
{
return "admin";
}
}
package com.boya.subject.model;
public class Teacher extends User
{
private String level; 教師職稱
public String getLevel()
{
return level;
}
public void setLevel( String level )
{
this.level = level;
}
public String getType()
{
return "teacher";
}
}
package com.boya.subject.model;
public class Student extends User
{
private String sn;學(xué)生學(xué)號
private SchoolClass schoolClass; 班級
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";
}
}
而對于Action我分別做了一個抽象類,之后別的從這里繼續(xù)
先是Action的
package com.boya.subject.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.boya.subject.frame.ID;
import com.boya.subject.frame.ServiceFactory;
import com.boya.subject.model.Person;
import com.boya.subject.service.Service;
import com.boya.subject.util.HtmlUtil;
public abstract class BaseAction extends Action
{
/**
* 由服務(wù)工廠方法創(chuàng)建服務(wù)
* @return 數(shù)據(jù)庫操作的服務(wù)
* 2006-5-16 18:10:04
*/
public Service getService()
{
ServiceFactory factory = (ServiceFactory) getAppObject( ID.SF );
Service service = null;
try
{
service = factory.createService();
}
catch ( Exception e )
{
}
return service;
}
/**
* 判定用戶是否合法登陸
* @param req
* @return 用戶是否登陸
* 2006-5-16 18:11:26
*/
public boolean isLogin( HttpServletRequest req )
{
if ( getPerson( req ) != null ) return true;
else
return false;
}
/**
* 抽象方法,子類實(shí)現(xiàn)
* @param mapping
* @param form
* @param req
* @param res
* @return
* @throws Exception
* 2006-5-16 18:12:54
*/
protected abstract ActionForward executeAction( ActionMapping mapping,
ActionForm form, HttpServletRequest req, HttpServletResponse res )
throws Exception;
/**
* 獲取session范圍的用戶
* @param req
* @return 當(dāng)前用戶
* 2006-5-16 18:13:35
*/
public abstract Person getPerson( HttpServletRequest req );
/**
* 父類的執(zhí)行Action
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public ActionForward execute( ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res ) throws Exception
{
if ( !isLogin( req ) )
{
HtmlUtil.callParentGo( res.getWriter(), ID.M_UNLOGIN, ID.P_INDEX );
return null;
}
return executeAction( mapping, form, req, res );
}
/**
* 刪除session中屬性為attribute的對象
* @param req
* @param attribute 對象屬性
* 2006-5-16 18:16:59
*/
public void removeSessionObject( HttpServletRequest req, String attribute )
{
HttpSession session = req.getSession();
session.removeAttribute( attribute );
}
/**
* 設(shè)置session中屬性為attribute的對象
* @param req
* @param attribute 設(shè)置屬性
* @param o 設(shè)置對象
* 2006-5-16 18:17:50
*/
public void setSessionObject( HttpServletRequest req, String attribute,
Object o )
{
req.getSession().setAttribute( attribute, o );
}
/**
* 設(shè)置application中屬性為attribute的對象
* @param req
* @param attribute 設(shè)置屬性
* @param o 設(shè)置對象
* 2006-5-16 18:17:50
*/
public void setAppObject( String attribute, Object o )
{
servlet.getServletContext().setAttribute( attribute, o );
}
public Object getSessionObject( HttpServletRequest req, String attribute )
{
Object obj = null;
HttpSession session = req.getSession( false );
if ( session != null ) obj = session.getAttribute( attribute );
return obj;
}
public Object getAppObject( String attribute )
{
return servlet.getServletContext().getAttribute( attribute );
}
public void callParentGo( HttpServletResponse res, String msg, String url )
throws IOException
{
HtmlUtil.callParentGo( res.getWriter(), msg, url );
}
public void callMeGo( HttpServletResponse res, String msg, String url )
throws IOException
{
HtmlUtil.callMeGo( res.getWriter(), msg, url );
}
public void callBack( HttpServletResponse res, String msg )
throws IOException
{
HtmlUtil.callBack( res.getWriter(), msg );
}
public void callMeConfirm( HttpServletResponse res, String msg, String ok,
String no ) throws IOException
{
HtmlUtil.callMeConfirm( res.getWriter(), msg, ok, no );
}
}
再是DispatchAction的
package com.boya.subject.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import com.boya.subject.frame.ID;
import com.boya.subject.frame.ServiceFactory;
import com.boya.subject.model.Person;
import com.boya.subject.service.Service;
import com.boya.subject.util.HtmlUtil;
public abstract class BaseDispatchAction extends DispatchAction
{
/**
* 由服務(wù)工廠方法創(chuàng)建服務(wù)
* @return 數(shù)據(jù)庫操作的服務(wù)
* 2006-5-16 18:10:04
*/
public Service getService()
{
ServiceFactory factory = (ServiceFactory) getAppObject( ID.SF );
Service service = null;
try
{
service = factory.createService();
}
catch ( Exception e )
{
}
return service;
}
/**
* 判定用戶是否合法登陸
* @param req
* @return 用戶是否登陸
* 2006-5-16 18:11:26
*/
public boolean isLogin( HttpServletRequest req )
{
if ( getPerson( req ) != null ) return true;
else
return false;
}
/**
* 獲取session范圍的用戶
* @param req
* @return 當(dāng)前用戶
* 2006-5-16 18:13:35
*/
public abstract Person getPerson( HttpServletRequest req );
/**
* 父類的執(zhí)行DispatchAction
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public ActionForward execute( ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res ) throws Exception
{
try
{
if ( !isLogin( req ) )
{
callParentGo( res, ID.M_UNLOGIN, ID.P_INDEX );
return null;
}
return super.execute( mapping, form, req, res );
}
catch ( NoSUChMethodException e )
{
callBack( res, ID.M_NOMETHOD );
return null;
}
}
/**
* 刪除session中屬性為attribute的對象
* @param req
* @param attribute 對象屬性
* 2006-5-16 18:16:59
*/
public void removeSessionObject( HttpServletRequest req, String attribute )
{
HttpSession session = req.getSession();
session.removeAttribute( attribute );
}
/**
* 設(shè)置session中屬性為attribute的對象
* @param req
* @param attribute 設(shè)置屬性
* @param o 設(shè)置對象
* 2006-5-16 18:17:50
*/
public void setSessionObject( HttpServletRequest req, String attribute,
Object o )
{
req.getSession().setAttribute( attribute, o );
}
/**
* 設(shè)置application中屬性為attribute的對象
* @param req
* @param attribute 設(shè)置屬性
* @param o 設(shè)置對象
* 2006-5-16 18:17:50
*/
public void setAppObject( String attribute, Object o )
{
servlet.getServletContext().setAttribute( attribute, o );
}
public Object getSessionObject( HttpServletRequest req, String attribute )
{
Object obj = null;
HttpSession session = req.getSession( false );
if ( session != null ) obj = session.getAttribute( attribute );
return obj;
}
public Object getAppObject( String attribute )
{
return servlet.getServletContext().getAttribute( attribute );
}
public void callParentGo( HttpServletResponse res, String msg, String url )
throws IOException
{
HtmlUtil.callParentGo( res.getWriter(), msg, url );
}
public void callMeGo( HttpServletResponse res, String msg, String url )
throws IOException
{
HtmlUtil.callMeGo( res.getWriter(), msg, url );
}
public void callBack( HttpServletResponse res, String msg )
throws IOException
{
HtmlUtil.callBack( res.getWriter(), msg );
}
public void callMeConfirm( HttpServletResponse res, String msg, String ok,
String no ) throws IOException
{
HtmlUtil.callMeConfirm( res.getWriter(), msg, ok, no );
}
}
對于程序中的一些提示信息,我比較喜歡用JS來寫,所以我把這些都放到了一個類中
import java.io.IOException;
import java.io.Writer;
public class HtmlUtil
{
public static void callParentGo( Writer out, String msg, String url )
throws IOException
{
out.write( " " );
}
public static void callMeGo( Writer out, String msg, String url )
throws IOException
{
out.write( " " );
}
public static void callMeConfirm( Writer out, String msg ,String ok, String no )
throws IOException
{
out.write( " " );
}
public static void callBack( Writer out, String msg ) throws IOException
{
out.write( " " );
}
}
接著上次的話題,下面的就是學(xué)生注冊時需要的學(xué)院,專業(yè),班級,三層列表,
學(xué)院:
專業(yè):
班級:
學(xué)院是上來就應(yīng)該有的,我們把他放到了LabelValueBean里
public Vector
{
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
connection = getConnection();
pstmt = connection.prepareStatement( "select * from institute" );
rs = pstmt.executeQuery();
Vector
institutes.add( new LabelValueBean( "請選擇所在學(xué)院", "" ) );
while ( rs.next() )
{
institutes.add( new LabelValueBean(
rs.getString( "institute" ), rs.getString( "id" ) ) );
}
return institutes;
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
close( rs );
close( pstmt );
close( connection );
}
return null;
}
而當(dāng)它選擇了一個學(xué)院后,相應(yīng)的getDepartments(this.value)的js腳本就該工作了,還是四步
var xmlHttp;
function createXMLHttpRequest()
{
if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
發(fā)出請求
function getDepartments(institute)
{
createXMLHttpRequest()
var url = "ajax.do?institute="+institute+"&method=getDepartments"
xmlHttp.open("GET",url, true)
xmlHttp.onreadystatechange = departments
xmlHttp.send(null)
}
處理響應(yīng)
function departments()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
resText = xmlHttp.responseText
each = resText.split("")
buildSelect( each, document.getElementById("departmentId"), "請選擇所在專業(yè)");
}
}
}
function buildSelect(str,sel,label)
{
sel.options.length=0;
sel.options[sel.options.length]=new Option(label,"")
for(var i=0;i
each=str[i].split(",")
sel.options[sel.options.length]=new Option(each[0],each[1])
}
}
我把從數(shù)據(jù)庫中得到的各個專業(yè)進(jìn)行了編碼,之后再這里再回歸回去,下面的是編碼過程
public StringBuffer getDepartmentsByInstituteIdForAjax( Long instituteId )
{
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
connection = getConnection();
pstmt = connection
.prepareStatement( "select * from department where instituteID=?" );
pstmt.setLong( 1, instituteId );
rs = pstmt.executeQuery();
StringBuffer sb = new StringBuffer();
while ( rs.next() )
{
sb.append( rs.getString( "department" ) + ","
+ rs.getLong( "id" ) );
if ( !rs.isLast() ) sb.append( "" );
}
return sb;
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
close( rs );
close( pstmt );
close( connection );
}
return null;
}
當(dāng)然這些都是由
public ActionForward getDepartments( ActionMapping mapping,
ActionForm form, HttpServletRequest req, HttpServletResponse res )
throws Exception
{
Service service = getService();
res.getWriter().write(
service.getDepartmentsByInstituteIdForAjax(
Long.parseLong( req.getParameter( "institute" ) ) )
.toString() );
return null;
}
來控制
===========班級的再這里
public ActionForward getClasses( ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res ) throws Exception
{
Service service = getService();
res.getWriter().write(
service.getClassesByDepartmentIdForAjax(
Long.parseLong( req.getParameter( "department" ) ) )
.toString() );
return null;
}
public StringBuffer getClassesByDepartmentIdForAjax( Long departmentId )
{
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
connection = getConnection();
pstmt = connection
.prepareStatement( "select * from class where departmentID=?" );
pstmt.setLong( 1, departmentId );
rs = pstmt.executeQuery();
StringBuffer sb = new StringBuffer();
while ( rs.next() )
{
sb.append( rs.getString( "class" ) + "," + rs.getLong( "id" ) );
if ( !rs.isLast() ) sb.append( "" );
}
return sb;
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
close( rs );
close( pstmt );
close( connection );
}
return null;
}
function getClasses(department)
{
createXMLHttpRequest()
var url = "ajax.do?department="+department+"&method=getClasses"
xmlHttp.open("GET",url, true)
xmlHttp.onreadystatechange = classes
xmlHttp.send(null)
}
function classes()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
resText = xmlHttp.responseText
each = resText.split("")
buildSelect( each, document.getElementById("classid"), "請選擇所在班級");
}
}
}
大家都知道Struts是一種基于MVC的結(jié)構(gòu),而這個MVC又怎么樣理解呢?書上闡述的一般都很具體,而我的理解很直白,我們可以把業(yè)務(wù)邏輯放到每個JSP頁面中,當(dāng)你訪問一個JSP頁面的時候,就可以看到業(yè)務(wù)邏輯得到的結(jié)果,而把這些業(yè)務(wù)邏輯與HTML代碼夾雜到了一起,一定會造成一些不必要的麻煩,可以不可以不讓我們的業(yè)務(wù)邏輯和那些HTML代碼夾雜到一起呢?多少得攙雜一些,那干脆,盡量少的吧,于是我們可以嘗試著把業(yè)務(wù)邏輯的運(yùn)算過程放到一個Action里,我們訪問這個Action,之后Action執(zhí)行業(yè)務(wù)邏輯,最后把業(yè)務(wù)邏輯的結(jié)果放到request中,并將頁面請求轉(zhuǎn)發(fā)給一個用于顯示結(jié)果的jsp頁面,這樣,這個頁面就可以少去很多的業(yè)務(wù)邏輯,而只是單純的去顯示一些業(yè)務(wù)邏輯計算結(jié)果的頁面而已。這時的Action稱為控制器,JSP頁可以叫做視圖了,而控制器操作的業(yè)務(wù)對象,無非就應(yīng)該叫模型了!
從上面的話,我們來分析一下當(dāng)我們要做一個分頁時所需要的部分,而在這之前,我們先看看他們的執(zhí)行過程吧,首先我們第一次請求訪問一個頁面,它會把所有記錄的前N條顯示給我們,之后計算是否有下一頁,等類似的信息,當(dāng)我們點(diǎn)下一頁的時候,就獲取下一頁的信息,我們還可以添加一個搜索,比如我們用于顯示學(xué)生的,可以安學(xué)生姓名查找,學(xué)號查找,班級查找。而對于顯示的對象,我們一般也都會封裝為javabean,所以用于放置查詢結(jié)果的容器是不定的,而這時,我們就需要用泛型來提升我們的代碼效率!
首先我們寫一個用于分頁顯示的javabean:
package com.boya.subject.model;
import java.util.Vector;
public class Page
{
private int current = 1; //當(dāng)前頁
private int total = 0; //總記錄數(shù)
private int pages = 0; //總頁數(shù)
private int each = 5; //每頁顯示
private int start = 0; //每頁顯示的開始記錄數(shù)
private int end = 0; //每頁顯示的結(jié)束記錄數(shù)
private boolean next = false; //是否有下一頁
private boolean previous = false; //是否有上一頁
private Vector
public Page( Vector
{
this.v = v;
each = per;
total = v.size(); //容器的大小就是總的記錄數(shù)
if ( total % each == 0 )
pages = total / each; //計算總頁數(shù)
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;
}
//獲取下一頁的對象們
public Vector
{
current = current + 1;
if ( (current - 1) > 0 )
{
previous = true;
}
else
{
previous = false;
}
if ( current >= pages )
{
next = false;
}
else
{
next = true;
}
Vector
return os;
}
//獲取上一頁
public Vector
{
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
return os;
}
//一開始獲取的
public Vector
{
if ( current * each < total )
{
end = current * each;
start = end - each;
}
else
{
end = total;
start = each * (pages - 1);
}
Vector
for ( int i = start; i < end; i++ )
{
E o = v.get( i );
gets.add( o );
}
return gets;
}
}
而對于按不同搜索,我們需要一個FormBean,一般的搜索,都是模糊搜索,搜索個大概,而且輸入的信息中文的比重也會很大,所以,我把對中文字符的轉(zhuǎn)換放到了這個BEAN里,在進(jìn)行select * from * where like這樣的查詢時,假如是like ''這樣就可以得到所有的記錄了,我便用這個來對付沒有輸入查詢要害字的情況,而like '%*%'可以匹配要害字,而%%也在這里添加上了!
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 "%%";
}
}
前期都做好了,我現(xiàn)在就要開始訪問這個Action了,可是這個控制器還沒寫呢!這里是代碼
public class AdminUserAction extends AdminAction
{
private Vector
private Page
protected ActionForward executeAction( ActionMapping mapping,
ActionForm form, HttpServletRequest req, HttpServletResponse res )
throws Exception
{
if ( !isSupper( req ) )
{
return notSupper( res );//假如不是超級治理員怎么辦?
}
Service service = getService();//獲取業(yè)務(wù)邏輯
SearchForm sf = (SearchForm) form;//獲取搜索FORM
String op = req.getParameter( "op" );//獲取用戶對頁面的操作
String search = req.getParameter( "search" );//是否執(zhí)行了搜索
Vector
if ( op == null )//假如用戶沒有執(zhí)行上/下一頁的操作
{
if ( search != null )//用戶假如執(zhí)行了搜索
{
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" ) )//假如是按用戶名查找
{
ss = service.getAllStudentByUserForAdmin( sf
.getKey() );
}
else
{
ss = service.getAllStudentBySnForAdmin( sf.getKey() );//按學(xué)號查找
}
form.reset( mapping, req );//重置搜索表單
}
else
{
ss = service.getAllStudentForAdmin( sf.getAny() ); //用戶未執(zhí)行查找就顯示全部,
}
if ( ss != null && ss.size() != 0 )//假如查找不為空,有記錄,那就創(chuàng)建一個分頁對象
{
ps = new Page
temp = ps.gets();//并獲取第一頁
}
}
else//假如用戶執(zhí)行了操作
{
if ( op.equals( "next" ) )//操作是下一頁
{
temp = ps.getNextPage();
}
if ( op.equals( "previous" ) )//操作是上一頁
{
temp = ps.getPreviouspage();
}
}
req.setAttribute( "search", SelectUtil.studentSearch() );//把搜索用到的表單放到request中
req.setAttribute( "students", temp );//該頁顯示的學(xué)生
req.setAttribute( "page", ps );//分頁對象
return mapping.findForward( "student" );//請求轉(zhuǎn)發(fā)
}
}
用到SelectUtil中的代碼如下:
/**
* 獲取學(xué)生查找類別的select
* @return 學(xué)生查找類別
* 2006-5-17 9:06:12
*/
public static Vector
{
Vector
s.add( new LabelValueBean( "按學(xué)號查找", "sn" ) );
s.add( new LabelValueBean( "按班級查找", "class" ) );
s.add( new LabelValueBean( "按姓名查找", "name" ) );
s.add( new LabelValueBean( "按用戶查找", "user" ) );
return s;
}
在看頁面視圖前先讓我們看看Model吧,
public class Student extends User
{
private String sn;
private SchoolClass schoolClass; //這里的班級做為了一種對象,我們在視圖顯示的時候就有了一層嵌套
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后,還是看看視圖吧,
先放個查詢表單:
由于模型中有嵌套,那么我們就將用到Nested標(biāo)簽,其實(shí)沒有嵌套也可以使用這個標(biāo)簽,下面的是用于顯示信息的,用迭迨器進(jìn)行遍歷request范圍的students,你不安排范圍,他會自動找到的,并把每次遍歷的對象起名叫student,并作為層次的根元素,
這里是顯示分頁對象的:
第
共
//上一頁是否存在
上一頁
//下一頁是否存在
下一頁
共有
到這里不知道您看明白了多少,在我的這個JSP頁里幾乎沒有任何的業(yè)務(wù)邏輯,這樣的設(shè)計就比把HTML和JAVA攙雜在一起好了很多。
假如用戶直接輸入了地址,不也可以直接訪問嗎?理論上是,我們可以加入session進(jìn)行跟蹤,以杜絕此類型事件發(fā)生,我們是不是要把每次對session的判定依次拷到每個頁里呢,之后下次需要驗證的SESSION換了,我們再換?太浪費(fèi)了,我的做法是做了一個自定義標(biāo)簽,來解決這個問題。
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class CheckTag extends TagSupport
{
private static final long serialVersionUID = 879137944441282895L;
private String check = "";//用來驗證的變量
private String url = "index.jsp";//出現(xiàn)錯誤要去的頁面
private String msg = "";//錯誤的提示
private String scope = "";//要嚴(yán)整變量的范圍
private String to = "go"; //假如驗證失敗,是將頁面后退,還是定位到哪里?
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;//先設(shè)為不可用
if ( scope.equalsIgnoreCase( "request" ) )//假如要檢查request范圍
{
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;//假如可用就繼續(xù)執(zhí)行此頁的其余部分
else
{//否則,哈哈
try
{
if ( to.equalsIgnoreCase( "go" ) ) //現(xiàn)在失敗了,就看怎么回到你該到的地方
HtmlUtil.callParentGo(
pageContext.getOut(), msg, url );//將瀏覽器定位到URL
else
HtmlUtil.callBack( pageContext.getOut(), msg );//后退一下頁面來阻止
return SKIP_PAGE;//跳過頁面的其余部分,不執(zhí)行
}
catch ( Exception e )
{
throw new JspException( e.toString() );
}
}
}
public void release()
{
super.release();
check = "";
url = "";
msg = "";
scope = "";
}
}
下面是用到的htmlUtil部分:
public static void callParentGo( Writer out, String msg, String url )
throws IOException
{
out.write( " " );
}
public static void callBack( Writer out, String msg ) throws IOException
{
out.write( " " );
}
寫個check.tld部署吧,
你 只要在每個頁面里寫下這個就可以判定用戶是否登陸了
<%@ taglib prefix="boya" uri="/WEB-INF/check.tld" %>
假如沒有登陸那么,會自動提示到首頁登陸,不錯,很完美吧?
新聞熱點(diǎn)
疑難解答