struts2的基本使用

structs2配置步骤(strucs使用的版本是2.3.32)

structs2解决的问题:
利用拦截器的原理,拦截每一个请求,执行相应的action,但是一个action能够处理多个请求,利于项目的管理和维护.
structs2的运行原理:
structs使用拦截器,利用反射的原理,将每一个请求都映射到相应的action中,实现一个action处理多个请求的需求.

1.导入jar包,是从官网上下载的,空白模板中找到的lib中找到的

2.配置structs.xml文件·

集中配置

* 初步配置:
<struts>
    
    <package name="hellodemo" extends="struts-default" namespace="/"> 
        
        <action name="hello" class="shen.com.hello.HelloStructs2"> 
            
            <result name="ok">/hello.jspresult> 
        action>   
    package>
struts>

分模块开发配置

1. 可以在包下新建xxx.xml文件,在其中配置struts,配置跟集中配置相同
2. 在struts.xml中引入xxx.xml文件(include标签)

访问action中的不同方法

主要是struts.xml中的action配置,共有3中方法,本人认为第二种通配符的方法较好
1. 在action标签中使用method,配置多个action表实现

<struts>
 <package name="hellodemo" extends="struts-default">
     <action name="user" class="shen.com.hello.UserAction" method="add">action>  
     <action name="user" class="shen.com.hello.UserAction" method="delete">action>  
 package>
struts>
  1. 使用通配符的方式
<struts>
<package name="hellodemo" extends="struts-default">
    
    <action name="user_*" class="shen.com.hello.UserAction" method="{1}">action>
package>
struts>
  1. 动态方法

3.配置拦截器,在xml中配置

  <filter>
    <filter-name>struts2filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>struts2filter-name>
    /*
  filter-mapping>

4.写action(相当于servlet文件)

action共有3中 编写方式

新建类,不继承任何类,不实现任何接口

package shen.com.hello;
public class HelloStructs2 {
    public String execute() {
        return "ok";
    }
}

新建类,实现Action接口

package shen.com.hello;
import com.opensymphony.xwork2.Action;
/*
 * 实现Action接口
 */
public class UserAction implements Action{
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

新建类,继承ActionSupport类

package shen.com.hello;
import com.opensymphony.xwork2.ActionSupport;
/*
 * 继承AcionSuppert
 */
public class PersonAction extends ActionSupport{  
}

structs2的其他配置

关于页面的配置

优先级是action中的优先级比较高

<package name="hellodemo" extends="struts-default">
    <global-result>
        <result name="success">/hello.jspresult>
    global-result>
    <action name="hello" class="shen.com.hello.HelloStructs2"> 
        
        <result name="ok">/hello123.jspresult> 
    action> 
<package>

struts2 页面数据操作

action中获取表单数据

(原始方式)action中获取表单数据

  • ActionContext
  • servletActionContext
  • 接口注入的方式(不多用)

(struts2方式)action中获取表单数据

  • 属性封装
  • 模型驱动封装(能够将表单数据直接封装带对象中)
1. 声明变量:
private User user=new User();
2.get方法
public User getUser() {
    return user;
}
3. 为变量赋值
user.setUserName(userName);
user.setPassword(password);
  • 表达式封装

封装表单数据到map或者 list中(了解即可)

action中操作域对象

主要是使用ServletActionContext域对象来操作

  • request
  • session
  • servletContext域对象

值栈

ognl概述

一种表达式,本身不是struts2的一部分,可以独立存在.
功能如下:** 在struts2中操作值栈,一般ognl在struts2中和struts2标签一起使用操作值栈
使用 **

值栈介绍

struts2的一种存储机制,类似于域对象.可以取值和存储

值栈存储位置

action每次访问的时候都会创建一个action对象,值栈存储于每一个action对象中,只有一个值栈对象.

值栈内部结构

(1)root,本身是list结构,大多数操作就是root上的操作
(2)context,本身是map结构,大多数是操作不在context

获取和使用值栈

获取:

(1)使用ActionContext

使用值栈

(1)使用set方法,在值栈中分配一个hash的map集合来存放set的变量,不多用.
(2)使用push方法,在值栈顶部push进去,取用不方便,不多用.
(3)使用设置变量,写get变量方法,然后这个变量会被存到值栈中,不用做显示的操作.

值栈中使用第3种方式,可以将对象,list集合,字符串等放入值栈.
在jsp页面中取值栈的内容:
使用ognl表达式

在jsp页面中设置:<%@ taglib uri="/struts-tags" prefix="s" %>
登陆成功:
    <s:property value="user.userName"/>

拦截器

拦截器概述

拦截器介绍

struts2中有很多的拦截器,很多的功能都被封装到了拦截器中,每次执行,都会执行默认的拦截器

拦截器执行时间

拦截器在action对象创建之后,方法访问之前执行.

拦截器的底层

——-拦截器底层主要有2中思想,aop思想和责任链设计模式

aop思想

面向切面编程,就是在增加功能的情况下不修改源代码

责任链设计模式

有很多的功能,只有一个功能完成之后,经过类似过滤器next方法之后,才能执行下一个功能.

过滤器和拦截器的区别

过滤器:理论上能够过滤所有东西,html,servlet,图片路径等
拦截器:只是拦截action

自定义拦截器

继承自MethodFilterInterceptor,重写doIntercept方法,拦截逻辑就在此方法中

拦截器拦截配置

1. 在package标签中设置拦截器
<interceptors>
    <interceptor name="logininterceptor" class="com.shen.inteceptor.MyInteceptor">interceptor>
interceptors>
2. 在action中设置拦截器的使用
<interceptor-ref name="logininterceptor">
    <param name="excludeMethods">loginVlaueStackparam>
interceptor-ref>
3. 由于2中的设置,导致默认的拦截器都不执行了,很多功能不能实现,所以应当手动执行一次拦截器
<interceptor-ref name="defaultStack">interceptor-ref>

你可能感兴趣的:(java)