1、下载 Struts2 框架:http://struts.apache.org/download.cgi 。目前最新版是 Struts 2.3.24。解压后找到 lib 文件夹,找到以下相关类库,待会复制到 Web 应用的 WEB-INF/lib 文件夹中。
其中部分 jar 包的说明如下:
struts2-core-2.3.24.jar // Struts 2 的核心库 xwork-core-2.3.24.jar // WebWork 的核心库,需要它的支持 ognl-3.0.6.jar // OGNL 表达式语言,Struts 2 支持该 EL 表达式 freemarker-2.3.22.jar // 表现层框架,定义了 Struts 2 的可视组件主题 commons-logging-1.1.3.jar // 日志管理 commons-fileupload-1.3.1.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','123456','吴宗宪','宪哥','男',53,'[email protected]','13587455478','台湾综艺本土天王'); INSERT INTO users VALUES(NULL,'kangkang','123','康金荣','康康','男',48,'[email protected]','18935497452','天王接班人');
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 整合开发技术详解