用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">密  码:</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> 
<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值