24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

【常州Java开发培训】struts的validate验证及拦截器讲解

2017-05-26 12:38:34 东方博宜 阅读

1、validate方法

在访问某个方法之前,进入validate方法!

A、定义Action继承ActionSupport

B、重写validate方法即可

validate控制跳转的方式:如果在validate方法中向ActionError中存储了值,则跳转到result节点中name="input"对应的页面!

例子:

index.jsp

    <h1 align="center">

用户登陆

</h1>


<form action="login.action" method="post">


<p>

用户名:

<input type="text" name="user.username" />

</p>


<p>

密码:

<input type="password" name="user.password" />

</p>


<p>

<input type="submit" value="提交" />

<input type="reset" value="重置" />

</p>


</form>

<!-- cssStyle相当于普通标签的style -->

<s:actionerror cssStyle="list-style:none;margin:0px;padding:0px"/>


UserAction:

public class UserAction extends ActionSupport {


private User user;


// 登陆方法

public String login() {

System.out.println(user);

return ActionSupport.SUCCESS;

}


// 拦截方法

public void validate() {

System.out.println("拦截方法!");


// 如果用户名或者密码有一个没有填写

if (user == null || user.getUsername() == null

|| user.getPassword() == null || user.getUsername().equals("")

|| user.getPassword().equals("")) {

              this.addActionError("用户名密码不能为空");

}

}


public User getUser() {

return user;

}


public void setUser(User user) {

this.user = user;

}


}


User:

public class User {


private String username;

private String password;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public User(String username, String password) {

super();

this.username = username;

this.password = password;

}

public User() {

super();

// TODO Auto-generated constructor stub

}

@Override

public String toString() {

return "User [password=" + password + ", username=" + username + "]";

}

}


struts.xml

   <package name="mystruts03" extends="struts-default" namespace="/">

      <!-- 登陆 -->

      <action name="login" class="com.user.action.UserAction" method="login">

          <result>/main.jsp</result>

          <result name="input">/index.jsp</result>

      </action>

   </package>



注意:validate方法默认会拦截Action中所有的方法! 

      如果要拦截特定的方法,将方法名修改为validate方法名,如:拦截login方法, 则方法名为:validateLogin()!

timg.jpg

2、拦截器

struts核心原理


例子:引用系统定义的拦截器

logger:日志拦截器

timer:时间拦截器


注意:如果一个action没有引用任何拦截器,则默认引用defaultStack的拦截器栈,如果action引用了某个拦截器,则不再引用默认的defaultStack的拦截器的栈!(defaultStack中params专门用来为参数(属性)赋值)


例子:action引用拦截器

      <!-- 登陆 -->

      <action name="login" class="com.user.action.UserAction" method="login">

          <!-- 引用系统定义的拦截器 -->

          <interceptor-ref name="logger"></interceptor-ref>

          <interceptor-ref name="params"></interceptor-ref>

          <interceptor-ref name="timer"></interceptor-ref>

          <result>/main.jsp</result>

      </action>


例子:action引用拦截器栈

      <!-- 定义拦截器栈 -->

      <interceptors>

         <!-- 自定义拦截器栈 -->

         <interceptor-stack name="myStack">

              <interceptor-ref name="logger"></interceptor-ref>

         <interceptor-ref name="params"></interceptor-ref>

         <interceptor-ref name="timer"></interceptor-ref>

         </interceptor-stack>

      </interceptors>

   

   

      <!-- 登陆 -->

      <action name="login" class="com.user.action.UserAction" method="login">

          <!-- 引用拦截器栈 -->

          <interceptor-ref name="myStack"></interceptor-ref>

          <result>/main.jsp</result>

      </action>


例子:自定义拦截器

步骤:

A、定义类,实现Interceptor接口


B、在struts.xml中定义这个Interceptor并在Action中引用


index.jsp

  <a href="userlist.action?role=A">获取列表</a>


UserAction:


public class UserAction extends ActionSupport {


private User user;

private String role;

//获取数据列表

public String userlist(){

System.out.println("获取数据列表action,当前用户角色:" + role + ",user信息:" + user);

return ActionSupport.SUCCESS;

}



public User getUser() {

return user;

}


public void setUser(User user) {

this.user = user;

}


public String getRole() {

return role;

}


public void setRole(String role) {

this.role = role;

}

    

}


AuthInterceptor:

/**

 * 检验权限,判断是否是管理员

 * @author Administrator

 *

 */

public class AuthInterceptor implements Interceptor{


public void destroy() {

        System.out.println("拦截器被销毁!");

}


public void init() {

System.out.println("拦截器init!");

}


public String intercept(ActionInvocation invocation) throws Exception {

System.out.println("拦截器执行!");

//为user属性赋值

User u = new User("管理员","123");

UserAction ua = (UserAction) invocation.getAction();//获取要访问的action

ua.setUser(u);

//判断是否是管理员

HttpServletRequest request = ServletActionContext.getRequest();

HttpServletResponse response = ServletActionContext.getResponse();

//获取角色

String role = request.getParameter("role");

//如果是管理员则放行

if(role != null && role.equals("A")){

   invocation.invoke();//拦截器放行

}else{

response.sendRedirect("index.jsp?msg=noauth");

}

System.out.println("Action执行结束后,访问拦截器!");

return null;

}


}


struts.xml

      <!-- 定义拦截器栈 -->

      <interceptors>

        <!-- 自定义拦截器 -->

        <interceptor name="auth" class="com.user.interceptor.AuthInterceptor"></interceptor>

      

         <!-- 自定义拦截器栈 -->

         <interceptor-stack name="myStack">

              <interceptor-ref name="auth"></interceptor-ref>

         <interceptor-ref name="defaultStack"></interceptor-ref>

         </interceptor-stack>

      </interceptors>

      

      <!-- 获取列表 -->

      <action name="userlist" class="com.user.action.UserAction" method="userlist">

         <interceptor-ref name="myStack"></interceptor-ref>

         <result>/main.jsp</result>

      </action>


3、struts的运行原理

A、前端页面发起struts请求(*.action)

B、请求被StrutsPrepareAdnExecuteFilter过滤

C、在访问Action之前,首先访问拦截器

D、过滤器读取struts.xml,判断要进入哪个Action的哪个方法(如果有validate,则先访问validate)

E、读取对应的result节点,准备跳转到对应的页面

F、Action访问结束,访问拦截器

G、跳转到页面


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn