struts登陸案例:
struts.xml
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.custom.i18n.resources" value="messages"></constant>
<package name="basic" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"></interceptor>
</interceptors>
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<action name="book_*" class="cn.itcast.action.BookAction" method="{1}">
<interceptor-ref name="privilege"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
<package name="login" extends="struts-default" namespace="/">
<action name="login" class="cn.itcast.action.LoginAction">
<result name="input">/login.jsp</result>
<result>/index.jsp</result>
</action>
</package>
</struts>
messages.properties(國際話信息):
username.required=用戶名不能爲空
username.length=用戶名不能小於三個字符
password.required=密碼不能爲空
loginfail=用戶名或者密碼錯誤mysql
action:
LoginAction:
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private User user=new User();
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
QueryRunner qr=new QueryRunner(DBCPUtil.getDataSource());
String sql="select * from user where username=? and password=?";
User loginUser=qr.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
if(loginUser==null){
this.addActionError(this.getText("loginfail"));
return INPUT;
}else{
ServletActionContext.getRequest().getSession().setAttribute("loginUser", loginUser);
return SUCCESS;
}
}
}web
LoginAction-validation.xml:
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message key="username.required"></message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">3</param>
<message key="username.length"></message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="password.required"></message>
</field-validator>
</field>
</validators>sql
jsp:
login.jsp:
<s:fielderror />
<s:actionerror/>
<form action="${pageContext.request.contextPath}/login.action" method="post">
用戶名:<input type="text" name="username"/>
密碼:<input type="password" name="password"/>
<input type="submit" value="登陸">
</form>
</body>apache
自定義攔截器
攔截器 的使用 ,源自Spring AOP(面向切面編程)思想
攔截器 採用 責任鏈 模式
* 在責任鏈模式裏,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。
* 責任鏈每個節點,均可以繼續調用下一個節點,也能夠阻止流程繼續執行
在struts2 中能夠定義不少個攔截器,將多個攔截器按照特定順序 組成攔截器棧 (順序調用 棧中的每個攔截器 )編程
一、 struts2 全部攔截器 都必須實現 Interceptor 接口
二、 AbstractInterceptor 類實現了 Interceptor 接口. 併爲 init, destroy 提供了一個空白的實現jsp
全部實際開發中,自定義攔截器 只須要 繼承 AbstractInterceptor類, 提供 intercept 方法實現ide
三、 經常使用struts2 攔截器
<interceptor-ref name="modelDriven"/> 模型驅動
<interceptor-ref name="fileUpload"/> 文件上傳
<interceptor-ref name="params"> 參數解析封裝
<interceptor-ref name="conversionError"/> 類型轉換錯誤
<interceptor-ref name="validation"> 請求參數校驗
<interceptor-ref name="workflow"> 攔截跳轉 input 視圖工具
案例 : 登錄,對其它Action訪問 經過自定義攔截器 進行權限控制
導入jar包 (struts2 jar、c3p0、 dbutils、 mysql驅動)
web.xml
struts.xml
JDBCUtils 工具類post
第一步 : 編寫index.jsp 提供 圖書增刪改查 四個功能
編寫BookAction ,提供四個業務方法
第二步: 完成登錄功能 ui
第三步 :必需要登錄 才能進行圖書管理
使用Filter 進行權限控制 ---- 過濾全部web請求 (全部web資源訪問)
使用攔截器 進行權限控制 ---- 主要攔截對Action訪問 (不能攔截JSP)
定義攔截器 繼承AbstractInterceptor
配置攔截器 方式一 <!-- 註冊攔截器 --> <interceptors> <interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"></interceptor> </interceptors> <action name="book_*" class="cn.itcast.action.BookAction" method="{1}" > <!-- 使用攔截器 --> <!-- 當使用自定義攔截器 後,默認攔截器 就會失效 --> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="privilege"></interceptor-ref> </action> 方式二 <!-- 註冊攔截器 --> <interceptors> <interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"></interceptor> <!-- 自定義攔截器棧 --> <interceptor-stack name="privilegeStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="privilege"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 設置當前包 全部Action 都使用 自定義攔截器棧 --> <default-interceptor-ref name="privilegeStack"></default-interceptor-ref>