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>