Java编写Struts2案例--【用户登录】

来源:互联网 发布:欢乐牛牛源码 编辑:程序博客网 时间:2024/06/10 04:06

好久没有更新了,对不起自己,对不起自己这些日子消耗的馒头和米饭……

常告诉自己不要常立志,到最后发现这就是常立的那个志……

答应自己一定要学编程,那就风雨兼程吧……


-----------我是分割线------------

最近很想自己写一个完整的Java Web项目,但是不使用框架特别复杂麻烦加困难,遂决定开始学习框架了,当然是最经典的ssh了。

先拿一个struts2.x来试一下,以下正文,纯粹个人笔记,如有雷同,你TM来砍我啊……


【1】项目目录截图

先贴一张项目目录截图,然后大致说明一下其中的关系,有一个简单的认识。



项目全部支撑分为四个部分:

a.src代码,分了三个简单的包:light.action / light.dao / light.entity ,分别存放action,service层和实体层;详细代码和调用流程见下面详解;

b.struts.xml和struts.properties配置文件;具体配置见下面详解;

c.WEB-INF下的JSP页面;不废话了;

d.在截图中未能体现的library,也就是Struts2.1 Libraries ;通过Eclipse的IDE可以直接导入,或者自己到网上下载一下然后手工导入也行;如果这个看不明白?——再见!


【2】Struts2.x工作流程——纯理论(下面贴完代码和配置之后还会有结合案例的说明)

用户访问一个JSP页面,进行操作(提交表单或者有条件请求等等)-->

tomcat识别需要把请求交给*.do的action,识别出使用了struts框架,指导程序读取struts配置文件-->

读取struts.xml,获取到其中的action配置,其中指明了需要调用哪个类-->

找到需要执行的类,struts将原始JSP页面中的信息自动赋值给执行类的相应变量中-->

执行类中的execute()方法,并返回String类型值-->

程序重新获取struts.xml中的对应action下的result配置,根据execute()方法返回的String值和配置匹配,执行相应的跳转或者其他操作


上述是一个理论上的struts2的一次请求的处理过程,先看看,有点迷糊不要禁,往下接着看……


【3】详细代码和配置

a.先贴一下配置内容

--struts.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><!-- 在此配置打开development模式,在报错时页面上会显示Java错误 --> <constant name="struts.devMode" value="true"></constant><constant name="struts.i18n.encoding" value="utf-8"></constant><package name="normalUser" extends="struts-default"><action name="verify" class="light.action.LoginAction"><result name="loginSuccess">/WEB-INF/users/loginSuccess.jsp</result><result name="loginFailure">/WEB-INF/users/loginErr.jsp</result></action></package></struts>    

b.User.java

package light.entity;import java.util.Date;/* * 描述:登录用户类,会有employee和administrator子类 */public class User {private int userId;private String name;private String password;private Date createDate;private Date modifyDate;private String isAdmin;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreateDate() {return createDate;}public void setCreateDate(Date createDate) {this.createDate = createDate;}public Date getModifyDate() {return modifyDate;}public void setModifyDate(Date modifyDate) {this.modifyDate = modifyDate;}public String getIsAdmin() {return isAdmin;}public void setIsAdmin(String isAdmin) {this.isAdmin = isAdmin;}//构造函数public User(String name, String password){this.name = name ;this.password = password;}}



c.UserDao.java

package light.dao;import light.entity.User;/* * 描述:登录用户的操作类 */public class UserDao {//用户登录查询public boolean loginCheck(User u){if(u.getName().equals("admin") && u.getPassword().equals("123")){return true ;}else{return false ;}}}



d.LoginAction.java

package light.action;import light.dao.UserDao;import light.entity.User;/* * Author:Light * For:Actions definition * Date:2015-12-05 */public class LoginAction {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}/*接受JSP信息并决定如何进行下去*/public String execute(){User u = new User(this.getUsername(),this.getPassword());UserDao userDao= new UserDao();//String msg = "";if(userDao.loginCheck(u)){//msg = "loginSuccess";//System.out.println(msg);return "loginSuccess";}else{//msg = "loginFailure";//System.out.println(msg);return "loginFailure";}}}


e.login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My web starting page:login.jsp</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>      <body>      <center>    <hr><h2>用户管理系统</h2>    <form name = "loginForm" action="verify.do" method = "post">    UserName: <input type = "text" name = "username"><br>    PassWord: <input type = "password" name = "password"><br>    <input type = "submit" value = "Login">    <input type = "reset" value = "Reset">        </form>  </center>      </body></html>


【4】Struts2.x工作流程——结合用户登录案例说明

用户访问一个JSP页面(login.jsp),进行操作(填写username和password,然后点击登录)-->

tomcat识别需要把请求交给*.do的action(verify.do),识别出使用了struts框架,指导程序读取struts配置文件(struts.xml)-->

读取struts.xml,获取到其中的action配置(<action name="verify" class="light.action.LoginAction">),其中指明了需要调用哪个类(LoginAction)-->

找到需要执行的类,struts将原始JSP页面中的信息(username & password)自动赋值给执行类的相应变量(其中同名的username&password)中-->

执行类中的execute()方法,并返回String类型值("loginSuccess"或者loginFailure)-->

程序重新获取struts.xml中的对应action下的result配置(<result name="loginSuccess">/WEB-INF/users/loginSuccess.jsp</result>
<result name="loginFailure">/WEB-INF/users/loginErr.jsp</result>),根据execute()方法返回的String值和配置匹配,执行相应的跳转(/WEB-INF/users/loginSuccess.jsp或者/WEB-INF/users/loginErr.jsp)


完美!


【5】调试过程中个人遇到的问题,共勉

a.在web.xml中配置welcome-file-list,如果配置的jsp文件不存在,那会报错;

b.在struts.xml中,配置packages中的extends : struts-default.xml,配置时".xml"不要写,只写文件名即可,不然启动时也会报文件找不到;

c.访问错误: Messages:No result defined for action light.action.LoginAction and result loginSuccess 

  调试了好几个小时,上网搜了一下,也没发现其他可疑之处,但是绝处逢生的是:有人说把login.action换个名字试试,于是我就改成了verify.action,你猜怎么着?还真就TMD好了。彼时彼刻,我的心情是崩溃的,然后想起来有一种心情叫日了吉娃娃……

d.struts.xml中result的跳转文件路径配置,最好从根路径开始配置,如下:
  <result name="loginSuccess">/WEB-INF/users/loginSuccess.jsp</result>


我就是喜欢看你们不如我,还赶不上我的气急败坏!

什么?!你梭啥?!你TM来砍我啊……



1 0