`
bhj626
  • 浏览: 21997 次
  • 性别: 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";   
这个没有用到

相关推荐

    struts2 实现登录实例

    本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2基础 Struts2是Apache软件基金会的开源项目,它继承了Struts1的优点并改进了其不足,如更灵活的配置、更强的拦截器机制等。Struts2的核心是...

    Struts2框架做的用户登录的简单实例

    在这个简单的用户登录实例中,我们主要关注Struts2的核心功能和如何构建一个基本的登录流程。 1. **Struts2框架基础**: - **Action类**:是Struts2的核心,用于处理用户的请求。在本例中,会有一个Action类来接收...

    struts框架实例

    在这个实例中,我们将集成 Struts2 和 Hibernate 3.2,创建一个简单的用户注册和登录功能。以下是一个详细的步骤指南: 1. **开发环境配置**: - 开发工具:NetBeans 6.5.1 - Java 运行环境:JDK 1.6 - 应用...

    Struts2框架实例

    Struts2框架是一个基于Model-View-Controller(MVC)设计模式的Java Web应用程序框架,由Apache软件基金会维护。这个框架极大地简化了开发过程,提高了可维护性和可扩展性。Struts2通过整合多种优秀框架,如Tiles、...

    struts2登录实例

    本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2框架简介 Struts2是由Apache软件基金会开发的开源框架,它继承了Struts1的优点并解决了其存在的问题。Struts2的核心是Action类和配置文件,...

    Struts1.2登录实例

    在本实例中,我们将深入探讨如何使用Struts1.2实现一个简单的登录功能,这将帮助我们理解Struts1的工作流程和配置细节。 首先,让我们了解Struts1的核心概念: 1. **ActionServlet**:这是Struts1的入口点,它是一...

    struts+spring+hibernate ssh框架一个实例

    这个实例将详细介绍如何将这三个框架整合到一起,实现一个完整的MVC(Model-View-Controller)架构。 Struts是Apache组织提供的一个开源MVC框架,主要负责控制层,处理用户请求,协调模型与视图之间的交互。它通过...

    struts最典型的登录注册实例

    Struts是Apache软件基金会 Jakarta项目下的一个开源框架,主要用于构建基于Java EE的Web应用程序。它提供了MVC(Model-View-Controller)设计模式的实现,帮助开发者更好地组织和管理应用程序的业务逻辑、用户界面和...

    struts开发实例一个

    这个实例“struts开发实例一个”旨在帮助初学者理解和掌握Struts框架的基本应用,包括前端验证和后端Action的实现。 在Struts框架中,前端验证通常指的是在用户提交表单数据之前在客户端进行的验证。这可以防止无效...

    struts2验证框架简单实例

    在Struts2框架中,验证框架是其一个重要组成部分,用于确保输入数据的准确性和完整性,从而防止因无效数据导致的程序异常或错误。本实例将带你深入理解Struts2验证框架的使用,以及在实际操作中可能遇到的问题和解决...

    Struts框架的三个项目实例

    Struts框架是Java Web开发中的一个关键组件,它基于MVC(Model-View-Controller)设计模式,旨在简化Web应用程序的构建。这个压缩包包含了三个使用Struts2框架实现的项目实例:租房管理、宠物管理和学生管理。这些...

    一个基于Struts+Hibernate+MsSql2000的实例

    本实例是一个基于Struts作为控制层、Hibernate作为数据持久化层,结合MsSql2000数据库的用户登录验证系统。下面将详细解释这三个关键组件及其在实际开发中的应用。 **Struts框架** Struts是一个开源的Java Servlet ...

    java框架struts2 简单完整实例

    本实例是一个基础的Struts2应用,展示了如何创建一个简单的Action,配置Action映射,以及生成相应的视图。随着你对Struts2的深入学习,你会了解到更多高级特性,如动态方法调用、国际化、主题和模板、拦截器栈等。...

    struts2实现用户登录注册

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中被广泛应用,尤其在处理复杂的业务逻辑和用户交互时。在这个项目"struts2实现用户登录注册"中,我们将深入探讨如何利用Struts2在Eclipse开发...

    struts2 的一个实例

    在这个实例中,我们将深入探讨Struts2的核心概念、配置以及如何创建一个简单的应用程序。 首先,理解Struts2的核心理念至关重要。Struts2框架通过提供一系列拦截器(Interceptor)来处理HTTP请求,这些拦截器按照预...

    struts2+spring+ibatis框架实例

    "struts2+spring+ibatis框架实例"是基于这三个框架的一个集成示例,它利用MySQL作为后端数据库。下面我们将详细探讨这三个框架及其在实际项目中的应用。 **Struts2框架** Struts2是MVC(模型-视图-控制器)架构模式...

    一个完整的struts2应用实例

    在这个"一个完整的Struts2应用实例"中,我们将深入探讨如何利用Struts2实现用户注册和登录功能,涉及的关键知识点包括Action的实现与配置、Struts2验证框架的应用、以及国际化资源文件的使用。 首先,**Action的...

    用struts实现用户登录

    本项目以"用Struts实现用户登录"为主题,旨在帮助初学者入门Struts框架,理解其基本工作原理和配置过程。 首先,我们要了解Struts框架的核心概念。MVC模式是软件设计中的一个经典模式,它将应用程序分为三个主要...

    struts2.0一个简单的入门实例

    以下是一个简单的入门实例,帮助初学者理解如何配置和使用Struts2.0。 首先,我们需要创建一个新的Web项目。在MyEclipse中,你可以新建一个Web项目,例如命名为"Struts2入门实例"。接下来,你需要导入Struts2运行所...

Global site tag (gtag.js) - Google Analytics