两个小例子登录和显示全部用户信息的模块(四)

勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了Struts2的ServletAIP的获取和各种类型的数据获取(三),如果没有看过,请观看上一章

为了对Struts2框架的开发流程,有一个更深层次的理解,这儿简单做两个小例子,讲解一下。

一. 第一个例子:用户登录功能的开发与介绍

有一个登录的界面,用户名和密码,如果输入正确的用户名和密码,便可以进入系统,显示用户与两个蝴蝶飞的关系。如果错误,依旧返回到登录界面,让用户继续登录,并且提示错误信息。

写框架项目时,先将最基本的结构搭建好,如数据库表,依赖jar包,包目录,配置文件,web.xml文件。

暂时没有用到Hibernate数据库,用静态数据进行模拟分析。

一.一 建立数据库表

暂时没有用到

一.二 建立包目录

创建基本的web.action,service,dao,pojo,utils五个常见的包

在这里插入图片描述

一.三 导入依赖的jar包

在这里插入图片描述

一.四 导入配置文件 struts.xml 和日志文件 log4j.properties

在struts2中添加log4j.properties属性文件,和struts.xml文件。

log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

### 级别设置成 info 级别
log4j.rootLogger=info, stdout

struts.xml中包括最基本的约束和一个空的包


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
     <!--修改国际化编码 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!--修改是否为开发者模式 -->
    <constant name="struts.devMode" value="true"></constant>

    <package name="user" extends="struts-default" namespace="/">
        

        <!-- 配置跳转页面,放置到最后 -->
        <action name="*">
            <result>/WEB-INF/content/{1}.jsp</result>
        </action>
    </package>
    
</struts>

如果是框架整合,还有相应的applicationContext.xml文件和hibernate.cfg.xml文件

一.五 编译web.xml文件,配置StrutsPrepareAndExecuteFilter 过滤器

Struts框架只需要配置Struts的核心过滤器即可,如果SSH,SSM框架整合后,需要配置相应的监听器

<!-- 配置struts2的过滤器 -->
<filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

一.六 根据数据库表或者项目分析,抽象出实体类

User.java, 里面具有的属性有:

/**
 * @param id 主键编号
 * @param name 姓名
 * @param sex 性别
 * @param age 年龄
 * @param relation 关系
 * @param password 密码
 */
private Integer id;
private String name;
private String password;
private String sex;
private Integer age;
private String relation;

需要做的事:

  1. 实现属性的setter和getter方法
  2. 添加两个构造方法,一个是空构造,一个是全部构造。
  3. 重写三个方法, toString() 方法,hashCode() 方法,equals() 方法。 为了表达对象相等,这里假设,如果name和password两个值都一样的话,就表示类是相同的。 source--->Generate hashCode() and equlas()------->选中name和password即可。
在这里插入图片描述

一.七 写Dao接口中的方法

暂时没有用过

一.八 根据Dao中的方法写Service中的方法

利用静态的属性,模拟相应的数据库中的数据。

UserService.java 类

通过静态的集合,定义模拟数据库中的数据

private static List<User> userList=new ArrayList<User>();
static {
    User user1=new User(1,"父亲","123","男",50,"爸爸");
    User user2=new User(2,"母亲","123","女",48,"妈妈");
    User user3=new User(3,"慧芳","123","女",27,"大姐");
    User user4=new User(4,"正伟","123","男",28,"大姐夫");
    User user5=new User(5,"莉莉","123","女",25,"二姐");
    User user6=new User(6,"敬龙","123","男",26,"二姐夫");
    User user7=new User(7,"两个蝴蝶飞","123","男",24,"在下");
    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);
    userList.add(user5);
    userList.add(user6);
    userList.add(user7);
}

里面写一个login(User user) 登录方法,

public User login(User user) {
    //这里应该写具体的sql语句,去查. 没有数据库,暂时用模拟数据分析
    if(userList.contains(user)) {
        User loginUser=null;
        //去判断是哪一个index
        for(User u:userList) {
            //用equals(),不能用==号判断
            if(u.equals(user)) {
                loginUser=u;
                break;
            }
        }
        return loginUser;
    }else {
        return null;
    }
}

一.九 在utils 包下创建 BaseAction 类

package com.yjl.utils;
import java.lang.reflect.ParameterizedType;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年8月23日 下午4:40:13
* @description BaseAction的工具类
*/
@SuppressWarnings(value= {"rawtypes","unchecked"})
public class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
    private static final long serialVersionUID = -7180401147510521582L;
    private Logger logger=Logger.getLogger(BaseAction.class);
    private T t;
    private Class clazz;
    public BaseAction() {
        //得到当前的类
        Class class1=this.getClass();
        //得到运行中的父类
        ParameterizedType parameterizedType=(ParameterizedType) class1.getGenericSuperclass();
        clazz=(Class) parameterizedType.getActualTypeArguments()[0];
        try {
            t=(T) clazz.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        logger.info("当前类的类:"+clazz.getName()+"完成初始化");
    }
    @Override
    public T getModel() {
        return t;
    }
    
}

一.十 在web.action包下 新建UserAction类,继承BaseAction类

package com.yjl.web.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.yjl.pojo.User;
import com.yjl.service.UserService;
import com.yjl.utils.BaseAction;

/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年8月23日 下午6:11:46
* @description 类描述
*/
public class UserAction extends BaseAction<User>{
    private static final long serialVersionUID = 1L;
    private UserService userSerive=new UserService();
    public String login() {
        //执行登录的操作
        User user=userSerive.login(getModel());
        if(user!=null) {
            //说明存在这个用户
            HttpServletRequest request=ServletActionContext.getRequest();
            request.getSession().setAttribute("currentUser",user);
            return SUCCESS;
        }else {
            HttpServletRequest request=ServletActionContext.getRequest();
            request.setAttribute("message","用户名或者密码错误");
            return LOGIN;
        }
    }
}

一.十一 根据Action中的调用方法及选回值,来配置相应的struts.xml文件

<struts>
    <!--修改国际化编码 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!--修改是否为开发者模式 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <package name="user" extends="struts-default" namespace="/">
        <action name="User_*" class="com.yjl.web.action.UserAction" method="{1}">
                <result name="login">/WEB-INF/content/login.jsp</result>
                <result name="success">/WEB-INF/content/success.jsp</result>
        </action>
        <!-- 配置跳转页面,放置到最后 -->
        <action name="*">
            <result>/WEB-INF/content/{1}.jsp</result>
        </action>

    </package>
</struts>

一.十二 写前端界面

/content/login.jsp页面

<body>
    ${message}
    <form action="User_login.action" method="post">
        用户名: <input type="text" name="name">  <br/>
        密&nbsp;&nbsp;&nbsp;码: <input type="text" name="password"><br/>
        <input type="submit" value="提交"/>
    </form>
</body>

/content/success.jsp页面

<body>
    登录成功,欢迎您,${currentUser.relation}
</body>

一.十三 测试运行,验证项目流程是否正确

重启服务器,验证项目是否正确

输入网址: http://localhost:8080/Struts_Login/login , 跳转到 login.jsp 页面

在这里插入图片描述

错误时:输入用户名为 两个蝴蝶飞, 密码为 1234. 是错误密码。

有图片

正确时: 错误用户名为 慧芳,密码为 123

有图片
在这里插入图片描述

项目按照预想的流程,运行。

二. 第二个项目, 显示全部的注册 用户

在用户登录成功之后,显示全部的用户信息。 即执行一个 list() 全部查询。

为了美化页面,采用Bootstrap前端框架进行编写 这里暂时不介绍Bootstrap的使用。

二.一 在UserService中添加findAll()方法

public List<User> findAll(){
    //实际应该调用具体的Dao中的sql语言查询数据库
    return userList;
}

二.二 在UserAction中实现list() 方法

该方法需要调用service中的findAll()方法查询全部

public String list(){
    List<User> userList=userSerive.findAll();
    //通过request 向后端输出值 
    ServletActionContext.getRequest().setAttribute("userList",userList);
    return "list";
}

二.三 struts.xml 添加 list 页面

在struts.xml中修改success的返回值,添加List()的返回值

<action name="User_*" class="com.yjl.web.action.UserAction" method="{1}">
        <result name="login">/WEB-INF/content/login.jsp</result>
        <!-- 利用redirectAction 重定向到List的方法 -->
        <result name="success" type="redirectAction">User_list</result>
        <result name="list">/WEB-INF/content/list.jsp</result>
</action>

二.四 放置 bootstrap 框架

在前端list.jsp添加Bootstrap进行美化数据, Bootstrap的下载组件放在Web-Context目录的/JS/plugins/ 目录下

有图片

二.五 编写 /content/list.jsp 页面

list.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/JS/plugins/bootstrap/css/bootstrap.min.css" type="text/css"/>
<script type="text/javascript" src="${pageContext.request.contextPath}/JS/plugins/bootstrap/js/bootstrap.min.js"></script>
<title>显示列表信息</title>
</head>
<body>
    <div class="container">
        <div class="row">
            <table class="table table-bordered table-hover">
                <caption>查看亲属信息</caption>
                <thead>
                    <tr>
                        <th class="col-xs-2">姓名</th>
                        <th class="col-xs-2">性别</th>
                        <th class="col-xs-2">年龄</th>
                        <th class="col-xs-2">关系</th>
                        <th class="col-xs-4" colspan="3">相关操作 
                                    <span style="padding-left:40px">
                                            <a href="#">添加按钮</a>    
                                    </span>
                        </th>
                    </tr>
                </thead>
                <tbody>
                    <c:forEach var="user" items="${userList}">
                            <tr>
                                <td>${user.name}</td>
                                <td>${user.sex}</td>
                                <td>${user.age}</td>
                                <td>${user.relation}</td>
                                <td>
                                    <a href="#">查看详情</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                                    <a href="#">修改</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                                    <a href="#">删除</a>
                            </tr>
                    </c:forEach>
                </tbody>
            </table>
        </div>
    </div>
</body>
</html>

注意要添加jstl的两个标签库, 在c:forEach中,items=${userList}中, 添加,删除,修改,查看详情四个链接铵钮,并没有具体实现。

本章节代码链接为:

链接:https://pan.baidu.com/s/1GEx9NhWGid629834IsZCnA 
提取码:stv3

谢谢您的观看!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342