国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

開源技術(shù)——體驗Struts

2019-11-17 05:54:36
字體:
供稿:網(wǎng)友

用戶登陸的實(shí)現(xiàn)

看到題目,您一定覺得很土,Struts早已風(fēng)靡,而關(guān)于Stuts的文章也早已遍地都是,假如你覺得土那你就別看了,我只是把我這段時間學(xué)到的一些比較膚淺知識在這里記錄一下,假如您真在這些連載文章中獲得了您想要的知識,那么我就會很欣慰了。
        這不快畢業(yè)了嗎?我選的題目就和Struts有關(guān),做一個關(guān)于學(xué)校的畢業(yè)設(shè)計選題系統(tǒng),就是B/S結(jié)構(gòu),訪問數(shù)據(jù)庫的一些俗套的東西,為了鞏固我這段時間學(xué)習(xí)Struts,我把這個系統(tǒng)竟往難里做,這樣對我這個動手能力差的人,實(shí)際工作經(jīng)驗少的人來說,會有點(diǎn)幫助吧?
        當(dāng)初就是這樣想的,所以就開始了我的Struts之旅。
        那我就從我的第一頁講起吧,當(dāng)然第一頁一般都是登陸,至于怎么配置Struts,您還是參考一些別人的文章吧,我覺得寫這些就夠土的了,寫怎么配置,怎么實(shí)現(xiàn)就更土!

        <%@ page contentType="text/Html; charset=gb2312"%>
        <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
       <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
       這句是生成驗證登陸表單所需要的js代碼
      
            用戶名:
            密碼:   
                           
                                                               onclick="window.location='Ajax.do?method=register'" value="注冊"/>
                           
       


       把控制格式的HTML刪除掉,應(yīng)該剩下這些就是主干了,對于這個畢業(yè)設(shè)計選題系統(tǒng),有三種角色,治理員(Admin),教師(Teacher),學(xué)生(Student)而我把他們的登陸都做到了一起,在后臺這三種角色也是都放在了一個表中,對于他們這三種對象,都是繼續(xù)于Person的類,所以在登陸時可以忽視他們的具體角色,用多態(tài)來實(shí)現(xiàn)登陸。        


    action="/ajax.do?method=login" :將一些關(guān)于登陸啊,注冊的一些亂七八糟的操作我都放到了一個DispatchAction,之后可以用method的不同來分別調(diào)用不同的功能。
   onsubmit="return validateLoginForm(this)":這個是用來實(shí)現(xiàn)Struts自帶的validate驗證
    :是用來顯示在登陸時的錯誤信息

    在這里需要的Struts相關(guān)配置會有如下的幾個方面:
      首先是要對配置文件進(jìn)行配置我們登陸時需要的FormBean和Action
       (1)struts-config.xml
            
           
                     對于登陸失敗,我們預(yù)備返回到這里
           
     (2)validation.xml:
            
                  user
                  ^[0-9a-zA-Z]*$
               這里是常量配置,因為我們還會需要到用戶名的驗證,所以把他設(shè)置為了常量
           

          下面是對這個bean的具體嚴(yán)整手段了,按字段field分別來寫他們所依靠depaends的檢驗手段,常用的有必須填required,正則表達(dá)式驗證mask,最大maxlength和最小minlength
            

                                 application.properties里讀取input.user.mask           
                    從application.properties里讀取input.user
                  
                  
                  以上三部分構(gòu)成了js的一條錯誤提示,以下是具體的嚴(yán)整規(guī)則了

               
                    mask
                    ${user}
                

                
                    minlength
                    1
                

                
                    maxlength
                    16
                

         

   Word"
    depends="required,mask,minlength,maxlength">
    
         resource="false" />
         resource="false" />
    
     mask
     ${password}
    

    
     minlength
     1
    

    
     maxlength
     16
    

   

  

 對于我們需要的FormBean是這樣寫的:
package com.boya.subject.view;

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ā),而是請求從定向
   }


 

整體結(jié)構(gòu)

為了讓大家更方便的了解我這個設(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( " " );
    }
}


 
加上點(diǎn)ajax

你問我什么叫ajax,我也不太了解,我了解的是那支培養(yǎng)了無數(shù)荷蘭足球精華的Ajax,誰知道怎么有人用幾個單詞的頭字母也能湊出這個單詞來,不過感覺用它來做東西,應(yīng)該會挺有意思的
比如當(dāng)用戶在注冊的時候,用戶點(diǎn)一個按紐不用刷新界面就可以獲得一句提示,是有這人還是沒有這人啊?這次我嘗試了用ajax技術(shù)來做一個三級要害的下拉列表,而這是我要講的要害。
其實(shí)現(xiàn)在一般的ajax都是向Servlet發(fā)出請求,之后服務(wù)器響應(yīng),再偷摸的把結(jié)果傳給它,之后顯示出來,而換到Struts,有人會發(fā)甍,也一樣,Action是Servlet,DispatchAction也是,只要把代碼往這里寫,讓它往.do那里請求就行了。
在接下來我就向大家介紹我是怎樣實(shí)現(xiàn)上述功能的
因為大學(xué)里面的結(jié)構(gòu)是這里的
學(xué)院-專業(yè)-班級-學(xué)生
在學(xué)生注冊的時候他是依靠于上述對象的,所以用戶注冊就需要一個三級的下拉選擇
而ajax就能象變魔術(shù)一樣,從服務(wù)器那里偷摸弄來您需要的列表
下面我先給大家展示一下第一個功能是怎么實(shí)現(xiàn)的吧?
當(dāng)用戶在注冊的時候,點(diǎn)一個按紐,之后會彈出一個alert來告訴你這個用戶是否有人用了,下面就讓我們來看看這個功能是怎么實(shí)現(xiàn)的吧?


這里定義了按紐,用來測試?yán)蠋熓欠褚呀?jīng)存在了
大體的ajax的JS代碼都上面這四部分,
先是創(chuàng)建xmlhttpRequest,
var xmlHttp;
function createXMLHttpRequest()
{
 if (window.XMLHttpRequest)
 {
  xmlHttp = new XMLHttpRequest();
 }
 else if (window.ActiveXObject)
 {
  xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
}
之后是客戶響應(yīng)部分的代碼
function teacherCheck()
{
 var f = document.TeacherRegisterForm 從表單里讀字段
 var user = f.user.value
 if(user=="")
 {
   window.alert("用戶名不能為空!")
  f.user.focus()
   return false
   }
 else
 {
  createXMLHttpRequest()        這里都是精華了
  var url = "ajax.do?method=checkUserIsExist&user="+user   定義響應(yīng)地址
  xmlHttp.open("GET",url, true)    發(fā)出響應(yīng)
  xmlHttp.onreadystatechange = checkUser  把從服務(wù)器得到的響應(yīng)再傳給另個函數(shù)

  xmlHttp.send(null)
   }
}

function checkUser()
{
 if (xmlHttp.readyState == 4)
 {
  if (xmlHttp.status == 200)
  {
   alert(xmlHttp.responseText)        這里是對響應(yīng)結(jié)果的操作,在這里我們是灘出對話框,并把服務(wù)器發(fā)來的信息顯示出來
  }
 }
}

我把所有亂七八糟的操作都放到了一個DispatchAction里,所以它也不例外的在這個DA中了
public ActionForward checkUserIsExist( ActionMapping mapping,
            ActionForm form, HttpServletRequest req, HttpServletResponse res )
            throws Exception
    {
        Service service = getService();
        res.getWriter().write(service.checkUserIsExistForAjax( req.getParameter( "user" ) ) );
        return null;
    }
它僅僅是把業(yè)務(wù)邏輯部分的結(jié)果發(fā)送回去,而真正的判定是在業(yè)務(wù)邏輯那里實(shí)現(xiàn)的,
public String checkUserIsExistForAjax( String user )把結(jié)果弄成String的形式傳回去
    {
        Connection connection = null;
        PreparedStatement pstmt1 = null;
        ResultSet rs = null;
        try
        {
            connection = getConnection();
            pstmt1 = connection
                    .prepareStatement( "select * from user where user=?" );
            pstmt1.setString( 1, user );
            rs = pstmt1.executeQuery();
            rs.last();
            if ( rs.getRow() > 0 )
            {
                return ID.M_EXIST; 用戶存在
            }
        }
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        finally
        {
            close( rs );
            close( pstmt1 );

            close( connection );
        }
        return ID.M_NOEXIST;用戶不存在
    }


 
用ajax實(shí)現(xiàn)三級下拉列表

接著上次的話題,下面的就是學(xué)生注冊時需要的學(xué)院,專業(yè),班級,三層列表,
學(xué)院:

     
    

專業(yè):

班級:


學(xué)院是上來就應(yīng)該有的,我們把他放到了LabelValueBean里
public Vector getInstitutes()
    {
        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try
        {
            connection = getConnection();
            pstmt = connection.prepareStatement( "select * from institute" );
            rs = pstmt.executeQuery();
            Vector institutes = new 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"), "請選擇所在班級");
  }
 }
}


分頁體會MVC

大家都知道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 v = null;    //存放查詢結(jié)果的容器

    public Page( Vector v ,int per)
    {
        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 getNextPage()
    {
        current = current + 1;
        if ( (current - 1) > 0 )
        {
            previous = true;
        }
        else
        {
            previous = false;
        }
        if ( current >= pages )
        {
            next = false;
        }
        else
        {
            next = true;
        }
        Vector os = gets();
        return os;
    }

 //獲取上一頁

    public Vector 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 os = gets();

        return os;
    }

 //一開始獲取的

    public Vector gets()
    {
        if ( current * each < total )
        {
            end = current * each;
            start = end - each;
        }
        else
        {
            end = total;
            start = each * (pages - 1);
        }
        Vector gets = new 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 ss; //用來裝結(jié)果的容器
    private Page ps; //分頁顯示的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 temp = null; //用于存放臨時反饋給用戶的結(jié)果容器
                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( ss, 10 );//將查詢結(jié)果和每頁顯示記錄數(shù)作為參數(shù)構(gòu)件對象
                        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 studentSearch()
    {
        Vector s = new 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,并作為層次的根元素,





//尋找了student的schoolClass屬性對象的schoolClass嵌套

      //student的名字

刪除



這里是顯示分頁對象的:



        //上一頁是否存在
        
               
                上一頁
               
   
       

        上一頁   
        
       //下一頁是否存在
         
         
          下一頁
         
   

        下一頁   
        

共有條數(shù)據(jù)



到這里不知道您看明白了多少,在我的這個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部署吧,



 1.0
 1.1
 
  check
  com.boya.subject.util.CheckTag
  
   check
   true
  
  
   url
   false
  
  
   msg
   true
  
  
   scope
   true
  
  
   to
   false
  
 




你 只要在每個頁面里寫下這個就可以判定用戶是否登陸了

<%@ taglib prefix="boya" uri="/WEB-INF/check.tld" %>


假如沒有登陸那么,會自動提示到首頁登陸,不錯,很完美吧?



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 丽水市| 岑巩县| 鹤壁市| 恩施市| 界首市| 哈密市| 古田县| 南乐县| 渭南市| 灵石县| 白水县| 静乐县| 基隆市| 丹寨县| 松溪县| 塘沽区| 肇州县| 建始县| 梁平县| 广水市| 深泽县| 平邑县| 沛县| 达州市| 多伦县| 吉林省| 武宁县| 台州市| 常德市| 郸城县| 全南县| 贡山| 阿合奇县| 台东市| 中方县| 磴口县| 黄石市| 嵊泗县| 明溪县| 龙川县| 息烽县|