你的位置:首页 > 软件开发 > Java > JavaWeb框架SSH_Struts2_(三)

JavaWeb框架SSH_Struts2_(三)

发布时间:2017-11-28 07:00:03
1. Struts2的**(使用**实现权限控制) **简介**概述**工作原理**的配置Struts2的内建**内建**的介绍内建**的配置自定义**实现自定义**应用案例-->使用**实现权限控制 2. 具体内容 2.1 **的概述 ...

JavaWeb框架SSH_Struts2_(三)

1. Struts2的**(使用**实现权限控制)

 

  • **简介
    • **概述
    • **工作原理
    • **的配置
  • Struts2的内建**
    • 内建**的介绍
    • 内建**的配置
  • 自定义**
    • 实现自定义**
    • 应用案例-->使用**实现权限控制

 

2. 具体内容

 

2.1 **的概述

 

  **是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器。Struts2的**是AOP(Aspect-Object-Programming,面向切面编程)的一种实现策略,是可插拔的,需要某一个功能时就“插入”这个功能的**,不需要这个功能就“拔出”**。开发者只需要提供**的实现类,并将其配置在Struts.

 

2.1.2 **的工作原理

 

  通常情况下,**都是一代理的方式调用的,它在一个Action执行前后进行拦截,围绕着Action和Result的执行而执行,其工作方式如下图所示,

JavaWeb框架SSH_Struts2_(三)

  Struts2**实现原理与Servlet过滤器实现原理类似,它以链式执行,对真正要执行的方法(execute())进行拦截。首先执行Action配置的**,在Action和Result执行之后,**会再次执行(与先前调用的顺序相反),在此链式执行的过程中,每一个**都可以直接返回,从而终止余下的**、Action及Result的执行。

  

2.1.3 **的配置

 

(1) **

  **的配置在struts.

 <interceptor name="interceptorName" class="interceptorClass">   <param name="paramName">paramValue</param> </interceptor>

  上述语法格式中,name属性用来指定**的名称,class属性用于指定**的实现类。在定义时,使用<param>标签传入参数。

(2) **栈

  在实际开发中,在Action执行前同时执行多个拦截动作,如用户登陆检查等,这时可以把多个**组成**栈。在使用时,可以将栈内的多个**当成一个整体来引用。当**栈被附加到一个Action上时,在执行Action之前必须先执行**栈中的每一个**。

  定义**栈使用<interceptors>和<interceptor-stack>子元素,当配置多个**时,需要使用<interceptor-ref>元素来指定多个**,配置语法如下:

 <interceptors>   <interceptor-stack name="interceptorStackName">    <interceptor-ref name="interceptorName"/>    ...   </interceptor-stack> </interceptors>

  上述语法中,interceptorStackName值表示配置的**栈的名称,interceptorName值表示**的名称。除此之外,在一个**栈中还可以包含另一个**栈,实例如下:

 <package name="default"namespace="/"extends="struts-default">  <!--**的声明-->  <interceptors>   <interceptor name="interceptor1" class="interceptorClass"/>   <interceptor name="interceptor2" class="interceptorClass"/>   <!--定义一个**栈mystack,该**栈中包括两个**和一个**栈-->   <interceptor-stack name="mystack">   <interceptor-ref name="defaultStack"/>   <interceptor-ref name="interceptor1"/>   <interceptor-ref name="interceptor2"/>   </interceptor-stack>  </interceptors> </package>

  上述代码中定义的**栈是myStack,在myStack栈中,除了引用了两个自定义的**interceptor1和interceptor2外,还引用了一个内置**栈defaultStack,这个**是必须要引入的。

(3) 默认**栈

   默认**可以对其指定包中的所有Action起到拦截的作用。一旦为某个包指定了默认**,并且该包中的Action未显式地指定**,则会使用默认**。默认**需要使用<default-interceptor-ref>元素,此元素为<package>元素的子元素。其语法格式如下:

 <default-interceptor-ref name="**(栈)的名称"/>

  上述语法格式中,name属性的值必须是已经存在的**或**栈的名称。下面用该语法格式配置一个默认**,示例代码如下:

<package name="default" namespace="/" extends="struts-default">  <!--**的声明-->  <interceptors>  <default-interceptor-ref name="**栈的名称"/>  <interceptors>   <interceptor name="interceptor1" class="interceptorClass"/>   <interceptor name="interceptor2" class="interceptorClass"/>   <!--定义一个**栈mystack,该**栈中包括两个**和一个**栈-->   <interceptor-stack name="mystack">   <interceptor-ref name="defaultStack"/>   <interceptor-ref name="interceptor1"/>   <interceptor-ref name="interceptor2"/>   </interceptor-stack>  </interceptors>  <!-- 配置该包下的默认**,既可以是**,也可以是**栈 -->  <default-interceptor-ref name="mystack"/>  <action name="login"class="cn.itcast.action.LoginAction">   <result name="input">/login.jsp</result>  </action> </package>

  上述代码中,指定了包下的默认**是一个**栈,该**栈将会作用于包下所有的Action。

  Notice:一个包下只能定义一个默认**,如果需要多个**作为默认**,则可以将这些**定义为一个**栈,再将这个**栈作为默认**即可。

 

2.2 Struts2的内建**

 

2.2.1 内建**的介绍

  只要自定义的包继承了Struts2的struts-default包,就可以使用默认包中的**,否则需要自己定义**。在Struts-default.

2.2.2 内建**的配置

  前面2.1已经介绍过相关配置,此处不再赘述。

 

2.3 Struts2自定义**

   

  struts2的内置**可以实现大部分的拦截任务,但是一些与系统逻辑相关的通用功能(如权限的控制、用户登陆控制等),则需要通过自定义**来实现。本节详讲如何自定义**。

 

2.3.1 实现自定义**

 

  在程序开发过程中,如果需要开发自己的**类,就需要直接或间接地实现com.opensymphony.xwork2. interceptor. Interceptor接口,具体代码如下:

import com.opensymphony.xwork2.DefaultActionInvocation;import java.io.Serializable;
public interface Interceptor extends Serializable { void init(); void destroy(); String interceptor (DefaultActionInvocation)throws Exception;}

  该接口提供一下三个方法:

  • void init():该方法在**被创建后会立即被调用,它在**的生命周期只有内只被调用一次。可以在该方法中对相关的资源进行必要的初始化;
  • void destroy():该方法与init()方法相对应,在**实例被销毁之前,将调用该方法来释放与**相关的资源。它在**的生命周期内也只被调用一次。
  • Spring intercept(ActionInvocation invocation)throws Exception:该方法是**的核心方法,用来真正执行拦截工作的代码,实现具体的拦截工作。

 

2.3.2 应用案例-----使用**实现权限控制

 

  通过之前对**学习,可以将自定义**的使用分为一下三个步骤:

  1. 用户自定义**类,必须实现Interceptor接口或者继承AbstractInterceptor类;
  2. 需要在struts.
  3. 在struts.

 

具体步骤如下:

 

(1)在intellij idea中创建Struts2的项目(可参考之前的博客 >(2)web.

<??><web-app ="http://   ="http://www.w3.org/2001/   xsi:schemaLocation="http://   version="3.1"> <filter>  <filter-name>struts2</filter-name>  <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping>  <filter-name>struts2</filter-name>  <url-pattern>/*</url-pattern> </filter-mapping> <!--首页(这一块儿是自己加进来的)--> <welcome-file-list>  <welcome-file>main.jsp</welcome-file> </welcome-file-list></web-app>

(3)在src目录下创建java包,如下

JavaWeb框架SSH_Struts2_(三)

(4)User.java

package cn.Mairr.domin;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; }}

(5)LoginAction.java

package cn.Mairr.action;import cn.Mairr.domin.User;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class LoginAction extends ActionSupport implements ModelDriven <User> { private static final long serialVersionUID = 1L; private User user = new User(); public User getModel() {  return user; } @Override public String execute() throws Exception {  //获取ActionContext  ActionContext actionContext = ActionContext.getContext();  if ("Mairr".equals(user.getUsername()) && "123".equals(user.getPassword())) {   actionContext.getSession().put("user", user);   return SUCCESS;  } else {   actionContext.put("msg", "用户名或者密码不正确");   return INPUT;  } }}

(6) BookAction.java

package cn.Mairr.action;import com.opensymphony.xwork2.ActionSupport;public class BookAction extends ActionSupport { public String add(){  System.out.println("book add");  return SUCCESS; } public String del(){  System.out.println("book del");  return SUCCESS; } public String update(){  System.out.println("book update");  return SUCCESS; } public String find(){  System.out.println("book find");  return SUCCESS; }}

(7)PrivilegeInterceptor.java

package cn.Mairr.interceptor;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class PrivilegeInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 1L; public String intercept(ActionInvocation invocation)throws Exception{  //得到ActionContext  ActionContext actionContext = invocation.getInvocationContext();  //获取user对象  Object user = actionContext.getSession().get("user");  if(user != null){   return invocation.invoke();  }else {   actionContext.put("msg","您还未登录,请先登陆");   return Action.LOGIN;  //用户如果不存在,返回login直  } }}

(8) main.jsp

<%-- Created by IntelliJ IDEA. User: mairr Date: 17-11-28 Time: 下午5:18 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>main.jsp</title></head><body> <a href="success.jsp">book del</a><br> <a href="success.jsp">book add</a><br> <a href="success.jsp">book update</a><br> <a href="success.jsp">book find</a><br></body></html>

(9) login.jsp

<%-- Created by IntelliJ IDEA. User: mairr Date: 17-11-28 Time: 下午5:17 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>登陆</title></head><body> <center>  ${requestScope.msg}<br>  <form action="login.action" method="post">   <table>    <tr>     <td><label style="text-align: right;">用户名:</label></td>     <td><input type="text" name="username"></td>    </tr>    <tr>     <td><label style="text-align: right;">密码:</label></td>     <td><input type="password" name="password"></td>    </tr>    <tr>     <td align="right" colspan="2">      <input type="submit" value="登陆">     </td>    </tr>   </table>  </form> </center></body></html>

(10)success.jsp

<%-- Created by IntelliJ IDEA. User: mairr Date: 17-11-28 Time: 下午5:42 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>成功页面</title></head><body>用户${user.username}操作成功</body></html>

(11) struts.

<??><!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  "http://struts.apache.org/dtds/struts-2.5.dtd"><struts> <package name="struts2" namespace="/" extends="struts-default">  <!--声明**-->  <interceptors>   <interceptor name="privilege" class="cn.Mairr.interceptor.PrivilegeInterceptor"/>   <interceptor-stack name="mystack">    <interceptor-ref name="defaultStack"/>    <interceptor-ref name="privilege"/>   </interceptor-stack>  </interceptors>  <!--用户登陆操作-->  <action name="login" class="cn.Mairr.action.LoginAction">   <result>/main.jsp</result>   <result name="input">/login.jsp</result>  </action>  <!--关于book操作-->  <action name="book_*" class="cn.Mairr.action.BookAction" method="{1}">   <result>/success.jsp</result>   <result name="login">/login.jsp</result>   <!--在action中使用自定义**-->   <interceptor-ref name="mystack"/>  </action> </package></struts>

 

 

  完成上述程序之后,发布程序,登录本机http端口,查看**实现功能; >JavaWeb框架SSH_Struts2_(三)

 

--------->(登陆失败)

 

JavaWeb框架SSH_Struts2_(三)

  • 登陆成功(用户名:Mairr   密码:123 )

JavaWeb框架SSH_Struts2_(三)

----------->(登陆成功,页面跳转到操作界面)

JavaWeb框架SSH_Struts2_(三)

 

-------->(选择操作)

JavaWeb框架SSH_Struts2_(三)

 

  上面的案例中,创建了一个方法过滤**PrivilegeInterceptor,然后在Struts.

 

原标题:JavaWeb框架SSH_Struts2_(三)

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。