前一篇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.
^_^。。。大概就這樣吧~~~估計自己還得再複習幾次,不多複習幾次肯定又得忘了。。。