前一篇blog写了关于struts2的简单入门,为了更好的知道对应关系,跟着书写一个简单的用户登陆的一个东东~~~

开发环境:tomcat7+MyEclipse10+struts2.3

首先准备要用的包:

struts简单入门2——用户登陆_struts

(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)方法只要不为空close

UsrDAO.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.

^_^。。。大概就这样吧~~~估计自己还得再复习几次,不多复习几次肯定又得忘了。。。