这几天一直都犯愁:感觉自己越来越厌学了,也许是学习的方法不对吧。一个月前就给自己说,学习再踏实些,我要一边补习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
struts-config.xml
LogonAction.java
LogonBean.java
LogonDao.java
LogonForm.java
Image.java
logon.jsp
index.jsp
细细的想,觉得或许还是自己的基础不够好,还是需要把最基本的学扎实了。于是,这些天又回到了起点:强化学习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>