前一篇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)方法只要不为空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.
^_^。。。大概就这样吧~~~估计自己还得再复习几次,不多复习几次肯定又得忘了。。。