一、最简登录 Demo:login.jsp——web.xml——struts.xml——LoginAction.java——struts.xml——index.jsp

1、下载 Struts2 框架:http://struts.apache.org/download.cgi 。目前最新版是 Struts 2.3.24。解压后找到 lib 文件夹,找到以下相关类库,待会复制到 Web 应用的 WEB-INF/lib 文件夹中。

其中部分 jar 包的说明如下:

struts2-core-2.3..jar       // Struts 2 的核心库
xwork-core-2.3..jar // WebWork 的核心库,需要它的支持
ognl-3.0..jar // OGNL 表达式语言,Struts 2 支持该 EL 表达式
freemarker-2.3..jar // 表现层框架,定义了 Struts 2 的可视组件主题
commons-logging-1.1..jar // 日志管理
commons-fileupload-1.3..jar // 文件上传与下载

2、打开 Eclipse,File——New——Dynamic Web Project,Project Name 输入 UserManage,Next,Next,勾选“Generate web.xml deployment descriptor”,Finish。

3、把第一步找到的 Struts 相关 jar 文件拷贝到 WebContent/WEB-INF/lib 下。

4、在 web.xml 文件中配置 Struts 2 的核心控制器,用来拦截客户端请求,并把请求转发到相应的 Action 类来处理。web.xml 在 WebContent/WEB-INF 目录下,一般用来配置欢迎页、servlet、filter等,当 Tomcat 部署应用程序时,会读取该 web.xml,该文件虽非必须,但当网站复杂时,该文件大有用处。

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>User Manage Project</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

5、在 WebContent 文件夹下创建视图页面 login.jsp。

<%@ page language="java"  pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %> <!—导入Struts 2标签库-->
<html>
<body>
<div>
<div>用户登录</div>
<div>
<s:form action="checkLogin" namespace="/login">
<s:textfield name="username" label="登录名称" />
<s:password name="password" label="登录密码" />
<s:submit value=" 登 录 " />
</s:form>
</div>
</div>
</body>
</html>

6、在 WebContent 文件夹下创建欢迎页面 index.jsp。

<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<body>
<div>
登录成功,欢迎您!
</div>
</body>
</html>

7、在 Java Resources 分类 src 目录下,New——Package,输入 action,然后在该 package 下,创建业务控制器 LoginAction。如果编辑器有提示”xxx cannot be resolved to a type“,那么 ctrl+shift+o 自动引用所使用的全部包。

package action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
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;
}
public String checkLogin()
{
if(this.username.equals("admin") && this.password.equals("123456"))
return SUCCESS;
else
return LOGIN;
}
}

8、在 struts.xml 文件中配置 LoginAction。struts.xml 在 Java Resources 分类 src 目录下:New——Other——XML——XML File,Next,File Name 输入 struts.xml。内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"/>
<package name="struts2_login" extends="struts-default" namespace="/login">
<action name="checkLogin" class="action.LoginAction" method="checkLogin">
<result name="success">/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
</package>
</struts>

action 节点的 name 属性定义该 Action 的名称,class 定义这个 Action的实际实现类,method 表示checkLogin 这个 Action 由实际实现类 LoginAction 的 checkLogin() 方法来处理。

每个 Action 对指定了 result 元素,每个 result 元素都定义了一个逻辑视图,name 定义了 Action 返回的字符串。

9、项目右键 Run as——Run on Server,选择 Tomcat Server,Next,Finish。

访问 http://localhost:8081/UserManage/login.jsp

登录名称输入:admin,登录密码输入:123456,登录成功后会转向 index.jsp 页面。

二、进阶登录注册管理 Demo:连接数据库,拦截器,输入校验。在上面的版本上进行修改。

1、创建 Mysql 数据库。下面的 SQL 语句要一句一句执行。

CREATE DATABASE usermanagedb CHARACTER SET utf8 COLLATE utf8_general_ci;
USE usermanagedb;
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
PASSWORD VARCHAR(20) NOT NULL,
NAME VARCHAR(20) NOT NULL,
nic VARCHAR(30) NOT NULL,
sex CHAR(2) NOT NULL,
age INT ,
email VARCHAR(30),
phone VARCHAR(20),
selfshow VARCHAR(300)
)CHARACTER SET gb2312 COLLATE gb2312_chinese_ci; INSERT INTO users VALUES(NULL,'Jacky','','吴宗宪','宪哥','男',53,'24545454@qq.com','','台湾综艺本土天王');
INSERT INTO users VALUES(NULL,'kangkang','','康金荣','康康','男',48,'658912347@qq.com','','天王接班人');

2、在 Java Resources 分类 src 目录下,New——Package,输入 database,然后在该 package 下,新建 DatabaseDAO.java 类,实现数据库功能的封装。并将 mysql-connector-java-5.0.3-bin.jar 文件拷贝到 lib 文件夹下。切记 URL 后面一定要加上”?characterEncoding=utf8“,不然会出现数据库中文乱码问题。

package database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class DatabaseDAO {
private static Connection con;
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL ="jdbc:mysql://localhost:3306/usermanagedb?characterEncoding=utf8";
private static final String NAME="root";
private static final String PASSWORD="sa";
// 类似单例模式 加载一次即可获取驱动
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {e.printStackTrace();}
}
//获取数据库连接
public static Connection getConnection(){
try {
con=DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (SQLException e) {e.printStackTrace();}
return con;
}
//关闭Connection
public static void closeCon(Connection con){
try {
if(con!=null)
con.close();
} catch (SQLException e) { e.printStackTrace();}
}
//关闭PreparedStatemen
public static void closePt(PreparedStatement pt){
try {
if(pt!=null)
pt.close();
} catch (SQLException e) { e.printStackTrace();}
}
//关闭ResultSet
public static void closeRs(ResultSet rs){
try {
if(rs!=null)
rs.close();
} catch (SQLException e) { e.printStackTrace();}
}
}

在该类中,声明了连接数据库的驱动、URL、账号和密码。getConnection() 方法负责获取数据库连接。

3、src 目录下,New——Package,输入 vo,然后在该 package 下,新建 Users.java 类。

package vo;

public class Users {
private int id;
private String username; //用户账号
private String password; //用户密码
private String name; //用户姓名
private String nic; //用户昵称
private String sex; //用户性别
private int age; //用户年龄
private String email; //用户email
private String phone; //用户电话
private String selfshow; //个人说明 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNic() {
return nic;
}
public void setNic(String nic) {
this.nic = nic;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSelfshow() {
return selfshow;
}
public void setSelfshow(String selfshow) {
this.selfshow = selfshow;
}
}

4、src 目录下,New——Package,输入 dao,然后在该 package 下,新建 UsersDAO.java 类,定义用户操作数据库,如添加用户、查询全部用户和删除用户等方法。

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import database.DatabaseDAO;
import vo.Users; //用户dao
public class UsersDAO {
private Connection con;
private PreparedStatement pt;
private ResultSet rs; // 查找用户名是否存在
public boolean findUsers(String username) {
boolean flag = false;
// 获取数据库连接
con = DatabaseDAO.getConnection();
try {
pt = con.prepareStatement("select * from users where username=?");
pt.setString(1, username);
// 执行sql语句 获取结果集
rs = pt.executeQuery();
// 如果继续执行 表示用户名存在
if (rs.next()) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
DatabaseDAO.closeRs(rs);
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return flag;
} // 用户注册
public int save(Users users) {
int i = 0;
con = DatabaseDAO.getConnection();// 获取数据库连接
try {
pt = con.prepareStatement("insert into users(username,password,"
+ "name,nic,sex,age,email,phone,selfshow)"
+ " values(?,?,?,?,?,?,?,?,?)");
// 设置参数
pt.setString(1, users.getUsername());
pt.setString(2, users.getPassword());
pt.setString(3, users.getName());
pt.setString(4, users.getNic());
pt.setString(5, users.getSex());
pt.setInt(6, users.getAge());
pt.setString(7, users.getEmail());
pt.setString(8, users.getPhone());
pt.setString(9, users.getSelfshow());
i = pt.executeUpdate();// 执行sql语句
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return i;
} public boolean login(Users users) {
boolean flag = false;
con = DatabaseDAO.getConnection();
try {
pt = con
.prepareStatement("select * from users where username=? and password=?");
// 设置参数
pt.setString(1, users.getUsername());
pt.setString(2, users.getPassword());
// 获取结果集
rs = pt.executeQuery();
// 如果能往下继续执行,表示用户名和密码正确
if (rs.next()) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
DatabaseDAO.closeRs(rs);
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return flag;
} public List findAllUsers() {
// 获取一个list对象,来添加所有用户
List list = new ArrayList();
con = DatabaseDAO.getConnection();
try {
pt = con.prepareStatement("select * from users");
rs = pt.executeQuery();
while (rs.next()) {
Users users = new Users();
users.setId(rs.getInt(1));
users.setUsername(rs.getString(2));
users.setPassword(rs.getString(3));
users.setName(rs.getString(4));
users.setNic(rs.getString(5));
users.setSex(rs.getString(6));
users.setAge(rs.getInt(7));
users.setEmail(rs.getString(8));
users.setPhone(rs.getString(9));
users.setSelfshow(rs.getString(10));
// 把users对象添加到list
list.add(users);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DatabaseDAO.closeRs(rs);
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return list;
} public Users selectInfo(String username) {
Users users = new Users();
con = DatabaseDAO.getConnection();
try {
pt = con.prepareStatement("select * from users where username=?");
// 设置参数
pt.setString(1, username);
// 返回结果集
rs = pt.executeQuery();
if (rs.next()) {
// 取出数据库的值
users.setId(rs.getInt(1));
users.setUsername(rs.getString(2));
users.setPassword(rs.getString(3));
users.setName(rs.getString(4));
users.setNic(rs.getString(5));
users.setSex(rs.getString(6));
users.setAge(rs.getInt(7));
users.setEmail(rs.getString(8));
users.setPhone(rs.getString(9));
users.setSelfshow(rs.getString(10));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库
DatabaseDAO.closeRs(rs);
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return users;
} public int update(Users users) {
int i = 0;
con = DatabaseDAO.getConnection();
try {
pt = con.prepareStatement("update users set password=?,name=?,"
+ "nic=?,sex=?,age=?,email=?,phone=?,selfshow=?"
+ " where username=? and id=?");
pt.setString(1, users.getPassword());
pt.setString(2, users.getName());
pt.setString(3, users.getNic());
pt.setString(4, users.getSex());
pt.setInt(5, users.getAge());
pt.setString(6, users.getEmail());
pt.setString(7, users.getPhone());
pt.setString(8, users.getSelfshow());
pt.setString(9, users.getUsername());
pt.setInt(10, users.getId());
i = pt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return i;
} // 删除用户
public boolean deleteUser(int id) {
boolean flag = false;
con = DatabaseDAO.getConnection();
try {
pt = con.prepareStatement("delete from users where id=?");
pt.setInt(1, id);
int i = pt.executeUpdate();
if (i > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
} return flag;
} //查询新增用户,按id降序排列,前8位
public List newUsers(){
List list = new ArrayList();
con = DatabaseDAO.getConnection();
try {
pt = con.prepareStatement("select * from users order by id desc limit 0,8");
// 返回结果集
rs = pt.executeQuery();
if (rs.next()) {
Users users = new Users();
// 取出数据库的值
users.setId(rs.getInt(1));
users.setUsername(rs.getString(2));
users.setPassword(rs.getString(3));
users.setName(rs.getString(4));
users.setNic(rs.getString(5));
users.setSex(rs.getString(6));
users.setAge(rs.getInt(7));
users.setEmail(rs.getString(8));
users.setPhone(rs.getString(9));
users.setSelfshow(rs.getString(10));
list.add(users);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库
DatabaseDAO.closeRs(rs);
DatabaseDAO.closePt(pt);
DatabaseDAO.closeCon(con);
}
return list;
}
}

5、WebContent 文件夹下新建 register.jsp 文件,用户注册内容和数据表 users 表相对应。

<%@ page language="java" pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title><s:text name="UserRegister" />
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<BODY>
<center><br/><br/><br/>
<h3>
<s:text name="UserRegister" />
</h3>
<div style="align:center;" >
<s:form action="register" method="post">
<s:textfield name="username" key="UserName" />
<s:password name="password" key="PassWord" />
<s:textfield name="name" key="Name" />
<s:textfield name="nic" key="NickName" />
<s:textfield name="sex" key="Sex" />
<s:textfield name="age" key="Age" />
<s:textfield name="email" key="Email" />
<s:textfield name="phone" key="Phone" />
<s:textarea name="selfshow" key="brief.introduction" />
<s:submit key='Register'/>
</s:form>
</div>
</center>
</body>
</html>

在 struts 2 中,<s:form>表单标签在默认情况下已经使用 table 标签进行布局,每个表单标签将占用一个 <tr>。

6、src 目录下,New——Package,输入 action,然后在该 package 下,新建 RegisterAction.java。

package action;
import dao.UsersDAO;
import vo.Users;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport {
private String username; //用户账号
private String password; //用户密码
private String name; //用户姓名
private String nic; //用户昵称
private String sex; //用户性别
private int age; //用户年龄
private String email; //用户email
private String phone; //用户电话
private String selfshow; //个人说明
private String tip; //服务器提示的tip属性 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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNic() {
return nic;
}
public void setNic(String nic) {
this.nic = nic;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSelfshow() {
return selfshow;
}
public void setSelfshow(String selfshow) {
this.selfshow = selfshow;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
} public String register()throws Exception {
UsersDAO dao=new UsersDAO();//实例化用户DAO对象
boolean flag=dao.findUsers(username); //查找用户是否存在
//flag为true表示用户名存在
if(flag){
this.setTip(this.getText("username.exist"));
return this.INPUT;
}
Users users=new Users();//实例化用户对象
users.setUsername(username);
users.setPassword(password);
users.setName(name);
users.setNic(nic);
users.setSex(sex);
users.setAge(age);
users.setEmail(email);
users.setPhone(phone);
users.setSelfshow(selfshow);
int i=dao.save(users); //将users对象传入save方法
if(i>0) { //i大于0表示注册成功
return this.SUCCESS;
}else{
this.setTip(this.getText("register.failed"));
return this.INPUT;
}
}
}

7、在包 action 下新建 RegisterAction-validation.xml 文件,该文件和 RegisterAction 类文件相对应,实现注册验证。

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators>
<!-- 验证 username 属性 -->
<field name="username">
<!-- 指定 username 属性不能为空 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="username.notnull"/>
</field-validator>
<!-- 指定 username 属性必须匹配正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message key="username.length"/>
</field-validator>
</field>
<!-- 验证 password 属性 -->
<field name="password">
<!-- 指定 password 属性不能为空 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="password.notnull"/>
</field-validator>
<!-- 指定 password 属性必须匹配正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message key="password.length"/>
</field-validator>
</field>
<!-- 验证 name 属性 -->
<field name="name">
<!-- 指定 name 属性不能为空 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="name.notnull"/>
</field-validator>
</field>
<!-- 验证 nic 属性 -->
<field name="nic">
<!-- 指定 nic 属性不能为空 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="nic.notnull"/>
</field-validator>
<!-- 指定 nic 属性必须匹配正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,30})]]></param>
<message key="nic.length"/>
</field-validator>
</field>
<!-- 验证 sex 属性 -->
<field name="sex">
<!-- 指定 sex 属性不能为空 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="sex.notnull"/>
</field-validator>
</field>
<!-- 验证 age 属性 -->
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">50</param>
<message key="age.length"/>
</field-validator>
</field>
</validators>

8、添加 regsucc.jsp。

<%@ page language="java"  pageEncoding="GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title><s:text name="register.succ"/></title>
</head>
<body>
<center>
<font size="3"><s:text name="register.success"/></font>
</center>
</body>
</html>

9、修改 struts.xml。

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf-8"/>
<!--不受权限控制的Action请求配置-->
<package name="users" extends="struts-default">
<!-- 用户注册action -->
<action name="register" class="action.RegisterAction" method="register">
<result name="success">/regsucc.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
</struts>

10.访问 http://localhost:8081/UserManage/register.jsp,如果在调试过程中出现问题,请检查 jar 文件版本是否不对。或者尝试重启 Eclipse。

11、新建 LoginAction.java。

package action;
import dao.UsersDAO;
import vo.Users;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username; //用户名
private String password; //密码
private String tip; //服务器提示的tip属性
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;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
public String login()throws Exception{
Users users=new Users();
users.setUsername(username);
users.setPassword(password);
UsersDAO dao=new UsersDAO();
boolean flag=dao.login(users);
//如果为true,登录通过
if(flag){
//将用户名存入session
ActionContext.getContext().getSession().put("username", username);
return SUCCESS;
}else {
this.setTip(this.getText("login.failed"));//登录失败,返回首页
return INPUT;
}
}
}

12、新建 AuthorityInterceptor.java。

package util;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorityInterceptor extends AbstractInterceptor {
//拦截Action处理的拦截方法
public String intercept(ActionInvocation invocation) throws Exception {
// 取得请求相关的ActionContext实例
ActionContext ctx=invocation.getInvocationContext();
Map session=ctx.getSession();
//取出名为username的session属性
String username=(String)session.get("username");
//如果username为空,表示没有登录,则返回重新登录
if(username!=null){
System.out.println("拦截通过!");
return invocation.invoke();
}
System.out.println("登录拦截!");
ctx.put("tip", "请先登录!");
return Action.LOGIN;
}
}

13、新建 FindAllUsersAction.java 。

package action;

import java.util.List;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; import dao.UsersDAO; public class FindAllUsersAction extends ActionSupport {
private String type; // 参数表示从哪个页面提交过来 public String findAllUsers() throws Exception {
UsersDAO dao = new UsersDAO();
List list = dao.findAllUsers();
// 将list对象存放在ActionContext里
ActionContext.getContext().put("list", list);
if ("admin".equals(type)) {
return this.INPUT; // 管理员查询
} else {
return this.SUCCESS;
} // 用户查询
} public void setType(String type) {
this.type = type;
} public String getType() {
return type;
}
}

14、新建 allusers.jsp。

<%@ page language="java" pageEncoding="gbk"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title><s:text name="find.allusers"/></title>
</head>
<body>
<center>
<div style="align:center;width:900px;" >
<s:text name="find.allusers"/>
<ul style="width:100%;margin-left:10px;">
<li style="width:25%;border-top:1px solid gray;border-right:1px solid gray;border-bottom:1px solid gray;" class="category">
<s:text name="UserName"/></li>
<li style="width:25%;border-top:1px solid gray;border-right:1px solid gray;border-bottom:1px solid gray;" class="category">
<s:text name="NickName"/></li>
<li style="width:24%;border-top:1px solid gray;border-right:1px solid gray;border-bottom:1px solid gray;" class="category">
<s:text name="Name"/></li>
<li style="width:25%;border-top:1px solid gray;border-bottom:1px solid gray;" class="category"><s:text name="look.detailed"/></li>
</ul>
<s:iterator value="list">
<ul style="width:100%;margin-left:10px;" onmouseover="this.className='highlight'" onmouseout="this.className=''">
<li style="width:25%;border-right:1px solid gray;border-bottom:1px solid gray;" >
<s:property value="username"/></li>
<li style="width:25%;border-right:1px solid gray;border-bottom:1px solid gray;" >
<s:property value="nic"/></li>
<li style="width:24%;border-right:1px solid gray;border-bottom:1px solid gray;" >
<s:property value="name"/></li>
<li style="width:25%;border-bottom:1px solid gray;" > <s:a href="selectinfo.action?username=${username}&type=allusers"><s:text name="look.detailed"/></s:a>
</li>
</ul>
</s:iterator>
</div>
</center>
</body>
</html>

15、在 struts.xml 中配置 AuthorityInterceptor 拦截器。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<!--不受权限控制的Action请求配置-->
<package name="users" extends="struts-default">
<!-- 用户注册action -->
<action name="register" class="action.RegisterAction" method="register">
<result name="success">/regsucc.jsp</result>
<result name="input">/register.jsp</result>
</action>
<!-- 用户登录action -->
<action name="login" class="action.LoginAction" method="login">
<result name="success">/main.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
<!--受权限控制的Action请求配置-->
<package name="users-authority" extends="struts-default">
<interceptors>
<!--定义一个名为authority的拦截器-->
<interceptor class="util.AuthorityInterceptor"
name="authority"/>
<!--定义一个包含权限检查的拦截器栈-->
<interceptor-stack name="mydefault">
<!--配置内建默认拦截器-->
<interceptor-ref name="defaultStack"/>
<!--配置自定义的拦截器-->
<interceptor-ref name="authority"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault" />
<!-- 查看所有用户 -->
<action name="findalluser" class="action.FindAllUsersAction" method="findAllUsers">
<result name="success">/allusers.jsp</result>
<result name="input">/allusers.jsp</result>
</action>
</package>
</struts>

16、慢慢体会 Struts2 框架。

参考资料:

1. 蒲子明 许勇 王黎等编著. Struts 2+Hibernate+Spring 整合开发技术详解

Struts2 入门实例的更多相关文章

  1. struts2入门实例

    引言: 接触.net有3.4年的时间了,一直想学习java,中间因为种种原因耽搁下来.本人学习java的目的,一是多条出路,二是和.net平台互相印证,毕竟只用一门语言,无论是在框架还是在眼界方面都会 ...

  2. struts入门实例

    入门实例 1  .下载struts-2.3.16.3-all  .不摆了.看哈就会下载了. 2  . 解压  后 找到 apps 文件夹. 3.    打开后将 struts2-blank.war   ...

  3. Struts2入门到放弃

    写在前面------------------------------------------------------------------------- 本文章主要从三个方面来学习Struts2框架 ...

  4. SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1). MVC:Model-View-Control Contr ...

  5. SpringMVC系列之(一) 入门实例

    Spring MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了.Spring MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也 ...

  6. Struts2 入门

    一.Struts2入门案例 ①引入jar包 ②在src下创建struts.xml配置文件 <?xml version="1.0" encoding="UTF-8&q ...

  7. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  8. Vue.js2.0从入门到放弃---入门实例

    最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...

  9. wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下     wxPython中文教程入门实例 wx.Window 是一个基类 ...

随机推荐

  1. Matlab GUI memo

    有一段时间没写博客,一周4篇文章都坚持不下来,不知道写哪个方面的内容,写研究相关就怕论文查重查到,其他方面也没太多时间去学.还是花时间多学点其他方面.废话到此,很早就做过matlab gui相关,现在 ...

  2. MongoDB主从复制+集群

    一.读写分离的概念 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步 ...

  3. 给定1-a的随机数生成器,产生1-b的随机数生成器

    转自http://www.code123.cc/959.html 先给出一个例子,后面会有扩展 题目 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数. (即:使用函数rand5() ...

  4. windows 2003 iis php

    我的环境 是   windows server200 ee   iis6.0  程序是php 1.一台安装好的 Windows 2003 服务器,并且已经安装了 IIS 6. 2.下载 windows ...

  5. android 弹出带按钮的对话框

    package com.example.helloworld; import android.os.Bundle;import android.app.Activity;import android. ...

  6. js的同步异步

    由于js没有多线程,所以处理多任务的时候,可以用异步回调来解决.js中setTimeout.setInterval.ajax(jq中可以选择同步或异步)均会开启异步.遇到异步模块,会将其推入值任务队列 ...

  7. BitmapFactory.decodeStream(inputStream)返回null的解决方法

    场景:Android,通过inputStream从网络上获取图片 随后两次使用BitmapFactory对InputStream进行操作,一次获取宽高,另一次缩放 但是在缩放时,发现inputStre ...

  8. 877. Stone Game

    问题 有偶数堆石头(数组长度为偶数),每堆石头有一些石头(数组元素为正),石头的总数是奇数.Alex和Lee两个人轮流取石头堆,每次可以从头部或尾部取,Alex先取. 给定这样一个数组,两人都以最优策 ...

  9. iis日志时间与本地日期不一样

    iis日志里面的时间是 UTC时间,所以要自已加时区进行转换:即 utc时间+8小时:

  10. 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)

    地址:https://open.weixin.qq.com/ 手册:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&am ...