NETCTOSS03_登陆模块

来源:互联网 发布:java 写入word文档 编辑:程序博客网 时间:2024/06/05 10:02

NETCTOSS03_登陆模块


界面及展示:


涉及技术:

地址栏输入指定地址,展现上图界面

输入账号,密码和验证码才能登陆,否则有相应的提示

点击验证码会更换一张新图片

验证码输入错误会提示错误,ajax技术异步判断

登陆成功会跳转到主界面,失败会重新回到登陆页面


源代码及具体细节:

LoginAction.java  判断账号密码是否正确的Action

package com.qxl.netctoss.action;import com.qxl.netctoss.dao.AdminDAO;import com.qxl.netctoss.entity.Admin;import com.qxl.netctoss.exception.MyException;import com.qxl.netctoss.util.DBUtil;import com.qxl.netctoss.util.Factory;public class LoginAction extends BaseAction {private String code;private String pwd;private String errorMsg;private static AdminDAO adminDAO = Factory.getAdminDAO();public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}public String execute() throws MyException{try {//System.out.println(code+","+pwd);Admin admin = adminDAO.findByCodeAndPwd(code, pwd);if(admin != null){session.put(ADMIN_KEY, admin);return "success";}else{errorMsg = "用户名或密码错误,请重试";return "fail";}} catch (MyException e) {e.printStackTrace();throw new MyException("查询账号密码错误",e);}}}

struts.xml

<!-- 登陆模块 --><package name="login" namespace="/login" extends="json-default"><!-- 登陆初始页面 --><action name="loginform"><result name="success">/WEB-INF/jsp/login.jsp</result></action><!-- 主页面:登陆成功后跳转的主页面 --><action name="index"><result name="success">/WEB-INF/jsp/index.jsp</result></action><!-- 登陆判断页面 --><action name="login" class="com.qxl.netctoss.action.LoginAction"><result name="success" type="redirectAction">index</result><result name="fail">/WEB-INF/jsp/login.jsp</result></action><!-- 图片验证码 --><action name="code" class="com.qxl.netctoss.action.VerifyCodeAction"method="code"><!-- StreamResult负责输出二进制信息 --><result name="success" type="stream"><!-- 给StreamResult对象的inputName属性赋值 --><!-- inputName是一个OGNL表达式,该表达式可以从VS中获取一个InputStream类型的对象 --><!-- StreamResult就是从这个InputStream对象中读取要输出的二进制信息 --><param name="inputName">inputStream</param></result></action><action name="checkcode" class="com.qxl.netctoss.action.VerifyCodeAction"method="checkcode"><result name="success" type="json"><param name="root">ok</param></result></action></package>

login.jsp

<%@page pageEncoding="utf-8" contentType="text/html; charset=utf-8" %><%@taglib uri="/struts-tags" prefix="s" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">    <head>        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />        <title>NetCTOSS</title>        <link type="text/css" rel="stylesheet" media="all" href="../styles/global.css" />        <link type="text/css" rel="stylesheet" media="all" href="../styles/global_color.css" />         <script type="text/javascript" src="../js/jquery-1.11.1.js"></script>        <script type="text/javascript">        //ajax检查验证码        function verifyCode(){            var b = false;        $.ajax({'url':'checkcode.action','data':'verifyCode='+$('#verifyCode').val(),'type':'post','dataType':'text','async':false,'success':function(data){if(data=="true"){b = true;$("#code_msg").empty();}else{b = false;$("#code_msg").html("验证码错误");}}});return b;            }            //检查账号是否为空            function checkUsername(){if($("#username").val()==""){$("#user_msg").text("账号不能为空");return false;}else{$("#user_msg").text("");return true;}            }            //检查密码是否为空            function checkPwd(){if($("#pwd").val()==""){$("#pwd_msg").text("密码不能为空");return false;}else{$("#pwd_msg").text("");return true;}            }        $(function(){$("#submit").click(function(){var b = checkUsername() && checkPwd() && verifyCode();if(b){$("#form1").submit();}});        });        </script>    </head>    <body class="index">        <div class="login_box">        <form action="login.action" method="post" id="form1">            <table>                <tr>                    <td class="login_info">账号:</td>                    <td colspan="2"><input id="username" name="code" type="text" class="width150" /></td>                    <td class="login_error_info"><span id="user_msg" class="required"></span></td>                </tr>                <tr>                    <td class="login_info">密码:</td>                    <td colspan="2"><input id="pwd" name="pwd" type="password" class="width150" /></td>                    <td><span id="pwd_msg" class="required"></span></td>                </tr>                <tr>                    <td class="login_info">验证码:</td>                    <td class="width70"><input id="verifyCode" name="verifyCode" type="text" class="width70" /></td>                    <td><img src="code.action" alt="验证码" title="点击更换"                     onclick="this.src='code.action?#'+(new Date()).getTime()"/></td>                      <td><span class="required" id="code_msg"></span></td>                              </tr>                            <tr>                    <td></td>                    <td class="login_button" colspan="2">                        <a href="javascript:;" id="submit"><img src="../images/login_btn.png" /></a>                    </td>                        <td><span class="required"><s:property value="errorMsg"/></span></td>                                </tr>            </table>            </form>        </div>    </body></html>

VerifyCodeAction.java  生成验证码图片和验证验证码是否正确

package com.qxl.netctoss.action;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import com.qxl.netctoss.util.ImageUtil;import com.sun.image.codec.jpeg.ImageFormatException;/** * 生成图片验证码 * */public class VerifyCodeAction extends BaseAction{private InputStream inputStream;private String verifyCode;private boolean ok;public InputStream getInputStream() {return inputStream;}public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}public boolean isOk() {return ok;}public void setOk(boolean ok) {this.ok = ok;}public String getVerifyCode() {return verifyCode;}public void setVerifyCode(String verifyCode) {this.verifyCode = verifyCode;}//code.actionpublic String code(){String number = ImageUtil.getNumber(4);session.put(VERIFY_CODE_KEY,number);try {byte[] arr = ImageUtil.getImageArray(52,23, number);inputStream = new ByteArrayInputStream(arr);} catch (ImageFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return "success";}//checkcode.actionpublic String checkcode(){String number = (String) session.get(VERIFY_CODE_KEY);//System.out.println(number+","+code);if(number != null){ok = number.equalsIgnoreCase(verifyCode);}return "success";}}

问题及体会:

1.实现XXXAware接口可得到相应的XXX。eg:

 

package com.qxl.netctoss.action;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.qxl.netctoss.util.Constants;public class BaseAction implements SessionAware,Constants{protected Map<String, Object> session;public void setSession(Map<String, Object> session) {this.session = session;}}

继承此基础Action即可使用session对象;此外,该类还实现了Constants接口,该接口中存的是常量,方便程序中直接使用。

2.生成图片时,result类型为stream。eg:

<!-- 图片验证码 --><action name="code" class="com.qxl.netctoss.action.VerifyCodeAction"method="code"><!-- StreamResult负责输出二进制信息 --><result name="success" type="stream"><!-- 给StreamResult对象的inputName属性赋值 --><!-- inputName是一个OGNL表达式,该表达式可以从VS中获取一个InputStream类型的对象 --><!-- StreamResult就是从这个InputStream对象中读取要输出的二进制信息 --><param name="inputName">inputStream</param></result></action>

3.如何使用json。

  a,使用:

  需要先导json-lib-2.1.jar和struts2-json-plugin-2.1.8.jar包。

  package不再继承struts-default而是继承json-default(json-default继承struts-default)。

eg:

<action name="checkcode" class="com.qxl.netctoss.action.VerifyCodeAction"method="checkcode"><!--  JSONResult默认把VS的栈顶(Action)做成JSON字符串返回;    JSONResult对象的root属性是一个OGNL表达式,通过该表达可以从VS中获取一个对象,JSONResult将把这个对象做成JSON字符串返回--><result name="success" type="json"><param name="root">ok</param></result></action>








0 0