`
bhj626
  • 浏览: 21669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用struts实现一个完整的登录框实例

阅读更多
    这几天一直都犯愁:感觉自己越来越厌学了,也许是学习的方法不对吧。一个月前就给自己说,学习再踏实些,我要一边补习java基础,一边学习struts、spring、ibatis、hibernate框架,一天天过去了,偶尔的会有些小的感悟,只是感觉还是没什么大的进展。
    细细的想,觉得或许还是自己的基础不够好,还是需要把最基本的学扎实了。于是,这些天又回到了起点:强化学习jsp、servlet、javabean、jdbc,争取更深入,更扎实些,再此期间,慢慢琢磨些设计模式的东西,也许学习框架时会好点。所以以后决定还是做些实例性的东西,至少这样不会枯燥,也给学习增加点刺激感吧。
    经过两个晚上的努力,做了这个登录实例,有点慢,不过为了练手嘛,主要在于体验各个环节及设计思路。
    本想采用jsp+javabean+jdbc来做,不过太懒了,看见自己前几天用struts做的一个登录页面(并未实现,只是练习验证码图片的生成),于是顺手就接着这个做吧。
    环境配置:开发环境myeclipse、框架struts、数据库采用sqlserver2000及相应的驱动包:mssqlserver.jar、msbase.jar、msutil.jar
步骤:
    1、在myeclipse里新建工程strutslogon,并搭建好struts框架
    2、在sqlserver中新建数据库mytest,新建表login,其字段:username、password。将三个驱动包导入到WEB-INF/lib/里
    3、编辑配置文件
    4、编辑以下java文件及jsp文件

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  	<servlet>
  		<servlet-name>Image</servlet-name>
  		<servlet-class>logon.Image</servlet-class>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>Image</servlet-name>
  		<url-pattern>/image</url-pattern>
  	</servlet-mapping>
  	
  	<welcome-file-list>
  		<welcome-file>logon.jsp</welcome-file>
  	</welcome-file-list>
  	
</web-app>

struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
  <data-sources />
  	<form-beans >
  		<form-bean name="logonForm" type="logon.LogonForm"></form-bean>
  	</form-beans>
  <global-exceptions />
  <global-forwards />
  	<action-mappings>
  		<action path="/logon"
  				name="logonForm"
  				type="logon.LogonAction"
  				input="/logon.jsp">
  			<forward name="success" path="/index.jsp"></forward>
  			<forward name="failure" path="/logon.jsp"></forward>
  		</action>
  	</action-mappings>
  <message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>



LogonAction.java
package logon;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class LogonAction extends Action{
	private LogonBean objLogonBean = new LogonBean();
	
	public LogonBean getObjLogonBean() {
		return objLogonBean;
	}

	public void setObjLogonBean(LogonBean objLogonBean) {
		this.objLogonBean = objLogonBean;
	}

	public ActionForward execute(ActionMapping mapping,	ActionForm form, 
		HttpServletRequest request, HttpServletResponse response)
		throws IOException, ServletException {
		
		String target = "success";
		if(!objLogonBean.validate(form, request, response))	target="failure";
		return mapping.findForward(target);
	}
}

LogonBean.java
package logon;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;

public class LogonBean {
	
	String inputrand 	= null;
	String realrand 	= null;
	String username 	= null;
	String password 	= null;
	String sqlstr 		= null;
	String warning 		= null;	
	public boolean validate(ActionForm form,HttpServletRequest request, HttpServletResponse response){

		HttpSession session = request.getSession();
		realrand = (String)session.getAttribute("rand");
		System.out.println(realrand);
		
		if(form!=null){
			LogonForm logonForm = (LogonForm)form;
			inputrand = logonForm.getRand();
			username = logonForm.getUsername();
			password = logonForm.getPassword();
			System.out.println("input:" + inputrand);
		} else {
			inputrand = null;
		}
		
		//验证是否输入了完整的登录信息
		if(inputrand.equals("") || username.equals("") || password.equals("")){
			request.setAttribute("warning", "请输入完整的登录信息");
			return false;
		}
		
		//如果验证码为空,返回false,及警告信息
		if(!inputrand.equals(realrand)){
			request.setAttribute("warning", "对不起,您输入的验证码有误,请重新输入!");
			return false;
		}
		
		//查询用户输入的用户名及密码是否合法
		sqlstr = "select * from login where username='" +username+ "' and password='" +password+ "'";
		List list = null;
		list = objLoginDao.ResultToList(objLoginDao.executeQuery(sqlstr));

		//如果查询结果为空,返回false,及警告信息
		if(list.size()<1){
			request.setAttribute("warning", "对不起,您输入的用户名和密码有误,请重新输入!");
			return false;
		}
		
		request.setAttribute("username", username);
		return true;
	}
	
	private LogonDao objLoginDao = new LogonDao();

	public LogonDao getObjLoginDao() {
		return objLoginDao;
	}

	public void setObjLoginDao(LogonDao objLoginDao) {
		this.objLoginDao = objLoginDao;
	}
}

LogonDao.java
package logon;

import java.sql.*; 
import java.util.*; 

public class LogonDao{ 
	
	String 		sDBDriver	= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; 
	String 		url			= "jdbc:sqlserver://localhost:1433;DatabaseName=mytest"; 
	String 		user		= "sa"; 
	String 		password	= "1"; 
	Statement 	stmt		= null; 
	Connection 	conn		= null; 
	ResultSet 	rs			= null; 
	List 		list 		= null;	//自定义,用于转化ResultSet到List类型
	
	public LogonDao(){ 
		try{ 
			Class.forName(sDBDriver).newInstance(); 
			System.out.println("加载数据库驱动成功"); 
		} 
		catch(Exception e) 
		{ 
			e.printStackTrace() ; 
		} 
	} 
	
	//执行查询语句 sql 并返回查询结果 
	public ResultSet executeQuery(String sql){ 
		System.out.println(sql);
		try{ 
			conn=DriverManager.getConnection(url,user,password); 
			Statement stmt=conn.createStatement(); 
			System.out.println("连接数据库成功"); 
			rs=stmt.executeQuery(sql); 
		} 
		catch(SQLException ex){ 
			System.err.println(ex.getMessage()); 
		} 
		return rs; 
	} 
	
	/**
	 * @description:该函数用于将查询结果转化为List,便于使用
	 * @param rs	待转换的ResultSet类型数据
	 * @return	转换后的List数据
	 */
	public List ResultToList(ResultSet rs){
		try {
			ResultSetMetaData rsmd = rs.getMetaData();
			int numberOfColumns = rsmd.getColumnCount();
			//
			System.out.println("numberOfColumns: " + numberOfColumns);
			Map rsMap = null;
			list = new ArrayList();
			
			while(rs.next()){
				rsMap = new HashMap(numberOfColumns);
				for(int r=1;r<numberOfColumns+1;r++){
					rsMap.put(rsmd.getColumnName(r), rs.getObject(r));
				}
				list.add(rsMap);
			}
		}
		catch(SQLException ex){
			System.err.println(ex.getMessage());
		}
		return list;
	}
	
	//执行一次更新
	public void executeUpdate(String sql){ 
		stmt=null; 
		rs=null; 
		try{ 
			conn=DriverManager.getConnection(url,user,password); 
			Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
			stmt.executeQuery(sql); 
			stmt.close(); 
			conn.close(); 
		} 
		catch(SQLException ex){ 
			System.err.println(ex.getMessage()); 
		} 
	} 
	
	//关闭 Statement 对象
	public void closeStmt() 
	{ 
		try{ 
			stmt.close(); 
		} 
		catch(SQLException e) 
		{ 
			e.printStackTrace(); 
		} 
	} 
	
	//关闭数据库连接
	public void closeConn() 
	{ 
		try{ 
			conn.close(); 
		} 
		catch(SQLException e) 
		{ 
			e.printStackTrace(); 
		} 
	} 
} 

LogonForm.java
package logon;

import org.apache.struts.action.ActionForm;

public class LogonForm extends ActionForm {
	private String username;
	private String password;
	private String rand;
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getRand() {
		return rand;
	}
	public void setRand(String rand) {
		this.rand = rand;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
}

Image.java
package logon;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class Image extends HttpServlet {
 
	//public static final long serialVersionUID = 1L ;
 
    //private static final String CONTENT_TYPE = "text/html; charset=GBK";

    public Color getRandColor(int fc, int bc) { //给定范围获得随机颜色
        Random random = new Random();
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    //Initialize global variables
    public void init() throws ServletException {
    }

    //Process the HTTP Get request
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        //设置页面不缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        // 在内存中创建图象
        int width = 60, height = 20;
        BufferedImage image = new BufferedImage(width, height,
                                                BufferedImage.TYPE_INT_RGB);

        // 获取图形上下文
        Graphics g = image.getGraphics();

        //生成随机类
        Random random = new Random();

        // 设定背景色
        g.setColor(getRandColor(200, 250));
        g.fillRect(0, 0, width, height);

        //设定字体
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));

        //画边框
        //g.setColor(new Color());
        //g.drawRect(0,0,width-1,height-1);

        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 155; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }

        // 取随机产生的认证码(4位数字)
        String sRand = "";
        for (int i = 0; i < 4; i++) {
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;
            // 将认证码显示到图象中
            g.setColor(new Color(20 + random.nextInt(110),
				20 + random.nextInt(110),
				20 + random.nextInt(110)));
            //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
            g.drawString(rand, 13 * i + 6, 16);
        }

		// 将认证码存入SESSION
	    request.getSession().setAttribute("rand", sRand);
	
	    // 图象生效
	    g.dispose();
	
		// 输出图象到页面
		//ImageIO.write(image, "JPEG", response.getOutputStream());
		JPEGImageEncoder encode = JPEGCodec.createJPEGEncoder(response.
		getOutputStream());
		encode.encode(image);
	}

	//Clean up resources
	public void destroy() {
	}
}

logon.jsp
<%@ page language="java" pageEncoding="gbk"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%
	String msg = null;
	msg = (String)request.getAttribute("warning");
%>
<html>
<head>
    <title>logon.jsp</title>
</head>

<body>
	<html:form action="/logon.do" method="post">
     	<table border="0" cellspacing="0" cellpadding="0" style="border:#1A3C79 1px solid;" bgcolor="white" align="center">
	        <tr height="10"><td colspan="2"></td></tr>
	        <tr height="22"><td colspan="2" align="center">用户登录</td></tr>
	        <tr height="22">
	          	<td width="100" align="right">用户名:</td>
	          	<td width="180" align="left"><input name="username" type="text" style="width:120px;height:18px;"></td>
	        </tr>
	        <tr height="22">
	          	<td align="right">密&nbsp;&nbsp;码:</td>
	          	<td align="left"><input name="password" type="password" style="width:120px;height:18px;"></td>
	        </tr>
	    	<tr height="22">
		    	<td align="right">验证码:</td>
		    	<td align="left">
			     	<table border="0" cellspacing="0" cellpadding="0">
			        	<tr>
			          		<td><input  name="rand" type="text" style="width:70px;height:18px;" maxLength="4"></td>
			          		<td>&nbsp;
			          			<img id="randImage" src="image" onclick="loadimage();" alt="点击下一张替换图片" style="margin-top:3px;width:60px;height:20px;cursor:hand;">
			          		</td>
			        	</tr>
			     	</table>
		    	</td>
	        </tr>
	        <tr height="25"><td colspan="2" align="center" valign="bottom"><input type="submit" value="提交"></td></tr>
	        <tr height="10"><td colspan="2"></td></tr>
      	</table>
    </html:form>
</body>
<script language="javascript"> 
	function loadimage(){ 
		document.getElementById("randImage").src = "image"; 
	}
	
	//验证登录信息如果有误,则给出提示信息
	msgWarning();
	function msgWarning(){
		var msg = "<%=msg %>";
		if(msg!="null")alert(msg);
	}
</script>
</html>

index.jsp
<html>
<head>
    <title>index.jsp</title>
</head>
<body>
	<br>
	<h3 align="center">${username},welcoming your comming!</h3>
</body>
</html>
分享到:
评论
1 楼 向奕昌 2011-03-02  
<img id="randImage" src="image" onclick="loadimage();" alt="点击下一张替换图片" style="margin-top:3px;width:60px;height:20px;cursor:hand;">  


这里点击不能生成第2张

document.getElementById("randImage").src = "image";   
这个没有用到

相关推荐

Global site tag (gtag.js) - Google Analytics