前一篇blog写了关于struts2的简单入门,为了更好的知道对应关系,跟着书写一个简单的用户登陆的一个东东~~~
开发环境:tomcat7+MyEclipse10+struts2.3
首先准备要用的包:
(1)配置web.xml文件(通过项目右键MyEclipse的add struts capabilities方法也可以快速地生成)
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping></web-app>(2)登陆页面login.jsp,注册成功跳转页面registUsrWelcome.jsp和管理员成功登陆页面adminWelcome.jsp
/anli/login.jsp
<!-- 如果是/test.action,会寻找根命名空间"/"中查找名为test的action --> <form action="usrLoginAction.action" method="post"> <!--这里是一个table,放用户名,密码,提交按钮--> </form>
/anli/registUsrWelcom.jsp和/anli/adminWelcome.jsp放不同的提示成功登入信息~
Usr.java
private Integer id;private String username;private String password; //放它们的get和set方法
DBConn.java
static Connection getConnection(){
Connection conn = null;
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/anli";
String username="root";
String password="";
conn = DriverManager.getConnection(url, username, password);
}catch(ClassNotFoundException e){
System.out.println("==========驱动找不到===========");
}catch(SQLException e){
System.out.println("==========获得数据库连接失败============");
}
return conn;
}
//dbClose(Connection conn,Statement st,ResultSet rs)方法只要不为空closeUsrDAO.java
public class UsrDAO {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
/**
* 根据用户名 密码 查询用户 登陆方法
*/
public Usr checkUsr(String username, String password){
Usr u = null;
String sql="select * from user u where u.username=? and u.password=?";
try{
conn = DBConn.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
while(rs.next()){
u = new Usr();
u.setId(rs.getInt("id"));
u.setUsername(rs.getString("username"));
u.setSuperuser(rs.getString("superuser"));
}
}catch(SQLException e){
e.printStackTrace();
}finally{
DBConn.dbClose(conn, ps, rs);
}
return u;
}
}UsrLoginAction.java
页面展现用户列表的处理结果集合:private ArrayList dataList;
主要的是execute()方法
public String execute()throws Exception{
UsrDAO dao = new UsrDAO();
Usr u = dao.checkUsr(username, password);
if(u == null)return "anli_error";
else{//登陆成功,这里开始判断权限 ,将用户保存到session
ActionContext.getContext().getSession().put("usr", u);
String superuser = u.getSuperuser();
if(superuser.equals("1"))//普通注册用户
return "anli_success_1";
else if(superuser.equals("2"))//分配了能看到某些药品价格的用户
return "anli_success_2";
else//admin因为第一次来此页面,设置页面数为1
return "anli_success_3";
}
}最后在struts.xml中配置Action
<struts>
<!-- struts2使用包来组织Action。 -->
<package name="struts2" extends="struts-default">
<!-- struts2的action名字就是它所处理的URL的前半部分。name属性既是该Action的名字页式它需要处理的URL的一部分,class指定实现类 -->
<action name="login" class="com.ascent.struts2.action.LoginAction">
<result name="error">/error.jsp</result><!-- 配置逻辑视图和物理视图之间的一次映射 -->
<result name="sucess">/welcome.jsp</result>
</action>
<action name="usrLoginAction" class="com.ascent.action.UsrLoginAction">
<result name="anli_success_1">/anli/registUsrWelcome.jsp</result>
<result name="anli_success_2">/anli/registUsrWelcome.jsp</result>
<result name="anli_success_3">/anli/adminWelcome.jsp</result>
<result name="anli_error">/anli/login.jsp</result>
</action>
</package>
</struts>===================================================
补充一下,结合c标签库的用法
查询所有用户
/anli/adminWelcome.jsp
<a href="findAllusrManagerAction.action">用户管理</a>
UsrDAO.java
public List<Usr> findAllUsr(){
List<Usr>list = new ArrayList<Usr>();
Usr u = null;
String sql = "select * from user";
try{
conn = DBConn.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
u = new Usr();
u.setId(rs.getInt("id"));
u.setUsername(rs.getString("username"));
u.setSuperuser(rs.getString("superuser"));
list.add(u);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
DBConn.dbClose(conn, ps, rs);
}
return list;
}UsrManagerAction.java中查询所有用户findAll功能方法
public String findAll(){
UsrDAO dao = new UsrDAO();
//查询所有用户的方法,返回用户集合
List<Usr> list = dao.findAllUsr();
//将用户集合保存在ActionContext
ActionContext.getContext().put("allUsr", list);
return "anli_showusr";
}struts.xml配置
<!-- 如果这里写错了会配置不成功 -->
<action name="*usrManagerAction" class="com.ascent.action.UsrManagerAction" method="{1}">
<result name="anli_showusr">/anli/admin_showusr.jsp</result>
</action>admin_showusr.jsp
<c:forEach items="${allUsr}" var="list">
<tr>
<td>${list.id}</td>
<td>${list.username}</td>
<td>
<c:if test="${list.superuser=='1'}">普通用户</c:if>
<c:if test="${list.superuser=='2'}">高级用户</c:if>
<c:if test="${list.superuser=='3'}">管理员</c:if>
</td>
</tr>
</c:forEach>记得加上下面的,引入c标签库
<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %> <%@ page isELIgnored="false" %>
再来分析一下struts.xml的配置和整个跳转的关系:
首先admin进入adminWelcom.jsp后,可以点击“用户管理”,
然后跳转到action="findAllusrManagerAction"
这时应该怎么跳转呢?通过查找struts.xml的配置文件,这时发现*usrManagerAction可以将这个action抓取下来(感觉这样说。。。)这时action到了这步,找到对应的class进行加载,调用的method为"{1}",{1}对应*号的内容,也就是查找这个class下对应的findAll方法。
findAll方法调用dao层(和数据库jdbc连接相关的层)的findAllUsr方法得到list。将这个list放到session中ActionSupport.put("allUsr",list)
这时返回anli_showusr,struts.xml配置文件查找该Action的返回结果,页面跳转到/anli/admin_showusr.jsp.
^_^。。。大概就这样吧~~~估计自己还得再复习几次,不多复习几次肯定又得忘了。。。

















