今天看了下Struts架構的概述,就用myeclispe試着動手開發了一個簡單的使用者登入程式。應用程式包括2個jsp檔案、一個ActionForm、一個Action以及其它。是:login.jsp(使用者登入及錯誤提示頁面),loginSuccess.jsp(提示登入成功頁面),LoginForm.java(ActionForm,存放使用者送出資訊),LoginAction.java(Action,簡單的處理使用者登入事件)。
下面開始動手吧。。。
首先我們先建立一個j2ee的web project
6-26-1.GIF
然後給這個項目添加Struts架構必要的檔案.在我們項目名上點選右鍵,選擇MyEclipes --> Add Struts Capabilities...彈出對話框圖2:
6-26-2.GIF
其中Struts config path就是我們的struts配置檔案,URL pattern我們選擇*.do,Default application resource為我們預設的資源檔案地方,你可以選擇它的存儲位置,我們在這裡保持預設。點選Finish後,項目結構類似于圖3:
6-26-3.GIF
然後修改/WEB-INF/web.xml檔案,為其添加标簽庫。将下面代碼添加至 </webapp> 上面:
<jsp-config>
<taglib>
<taglib-uri>/tags/struts-html</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib-uri>/tags/struts-bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
<taglib-uri>/tags/struts-logic</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</jsp-config>
完成後,打開struts-config.xml檔案,點選這個界面左下角的Design進入可視化設計界面。我們先建立loginSuccess.jsp檔案.點選Palette面版上的建立JSP檔案圖示,彈出建立JSP檔案面闆。圖4:
6-26-11.GIF
完成後,struts-config.xml檔案自動被更新,可視化界在上也出現了剛建立的JSP子產品。建立的jsp檔案也打開了。覆寫所有的<%@ taglib ...... 為我們開始在/WEB-INF/web.xml中定義的:
<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>
<%@ taglib uri="/tags/struts-logic" prefix="logic"%>
然後在<body></body>中添加:
Hello <bean:write name="userName" scope="request" /> .
這裡将request中的屬性userName輸出在頁面上,是以等下我們在loginAction中,登入成功後要設定一個相關屬性。
下面來開始我們最後三個檔案的設計吧。在Struts-config.xml的Design模式中,在畫版的空白區域點右鍵,選擇New --> New Form, Action and JSP 彈出ActionForm的選項面闆,我們按圖上輸入相關值,圖5:
6-26-5.GIF
因為我們這隻是簡單的示範一個登入片段,是以不用驗證使用者資訊是否合法,是以将 Option Details的method頁籤的建立方法去掉,如圖:
6-26-6.GIF
接下來選擇 Optional Details的JSP頁籤,我們選中Create JSP form? 這一步myeclipse将為我們建立一個簡單的與使用者互動的登入頁面:
6-26-7.GIF
點Next,進入Action選項面闆.将Option Details的Form頁籤中Validate Form取消選擇,如圖:
6-26-8.GIF
6-26-9.GIF
點選Finish完成。在Struts-config.xml的Design中,可以看到圖所示:
6-26-10.GIF
最後,簡單的修改一下login.jsp,将所有<%@ taglib ...%>替換為:
修改LoginAction如下所示:
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
LoginForm loginForm = (LoginForm) form;
// TODO Auto-generated method stub
String name = loginForm.getUserName();
String password = loginForm.getPassword();
DBbase myDb = new DBbase();
ResultSet rs = null;
int result = 0;
String sql = "select count(*) as count from users where username = '"+name+"' and password = '"+password+"'";
try
{
rs = myDb.executeQuery(sql);
if(rs.next())
{
result = rs.getInt("count");
}
}
catch(SQLException ex)
ex.printStackTrace();
if(result>0)
request.setAttribute("userName",name);
return mapping.findForward("success");
return mapping.findForward("failure");
}
加入一個資料通路javaBean:
package com.vitamin.DataAccess;
import java.sql.*;
public class DBbase {
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnstr = "jdbc:odbc:myDB";
Connection connect = null;
Statement stmt = null;
public DBbase()
try
{
Class.forName(sDBDriver);
}
catch(ClassNotFoundException ex)
System.err.println(ex.getMessage());
public ResultSet executeQuery(String sql)
this.connect = DriverManager.getConnection(sConnstr);
this.stmt = this.connect.createStatement();
rs = stmt.executeQuery(sql);
catch(SQLException ex)
return rs;
public int executeUpdate(String sql)
int result = 0;
result = stmt.executeUpdate(sql);
return result;
}
好了,完成!!用浏覽器上打開:http://localhost:8080/HelloStruts/login.jsp,就可以了
哦,出了問題了,中文輸入不支援,呵呵,想點辦法來讓個一勞永逸吧。。
Servlet2.3開始增加了事件監聽和過濾器,管道和過濾器是為處理資料流的系統而提供的一種模式,它由管道和過濾器組成,每個處理步驟都封裝在一個過濾器元件中,資料通過相鄰過濾器之間的管道進行傳輸,每個過濾器可以單獨修改,功能單一,并且順序可以進行配置。
在Web.xml中修改如下:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.vitamin.util.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>
<filter-mapping>
<url-pattern>/*</url-pattern>
</filter-mapping>
新加一個類EncodingFilter:
package com.vitamin.util;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class EncodingFilter implements Filter
{
private FilterConfig config = null;
private String targetEncoding = "GBK";
public EncodingFilter()
super();
// TODO 自動生成構造函數存根
public void init(FilterConfig config) throws ServletException
// TODO 自動生成方法存根
this.config = config;
this.targetEncoding = config.getInitParameter("encoding");//從配置中讀取初始化參數
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
System.out.println("目标編碼:"+this.targetEncoding);
request.setCharacterEncoding(this.targetEncoding);
response.setCharacterEncoding(this.targetEncoding);
chain.doFilter(request,response);
public void destroy()
this.config = null;
this.targetEncoding = null;
這樣就可以很好地解決中文亂碼的問題了。。。
本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2006/06/26/436355.html,如需轉載請自行聯系原作者