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


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

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

    上一章简单介绍了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
    

    谢谢您的观看!!!

  • 相关阅读:
    URAL1996 Cipher Message 3(KMP + FFT)
    UVa12633 Super Rooks on Chessboard(容斥 + FFT)
    SPOJ TSUM Triple Sums(FFT + 容斥)
    UVa12298 Super Poker II(母函数 + FFT)
    LA4671 K-neighbor substrings(FFT + 字符串Hash)
    HDU4080 Stammering Aliens(二分 + 后缀数组)
    HDU4609 3-idiots(母函数 + FFT)
    HDU1402 A * B Problem Plus(FFT)
    快速傅里叶变换FFT学习小记
    HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)
  • 原文地址:https://www.cnblogs.com/yjltx/p/13071446.html
Copyright © 2020-2023  润新知