Struts2框架入门

整理自一个文档 作者郝文龙 博客首页:https://me.****.net/a639735331

1.struts2简介

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

Struts2框架入门

2.struts2环境

案例:struts001_hello

1.下载struts-2.3.14-all.zip开发包,解压到指定目录

Struts2框架入门

 

2.打开apps

Struts2框架入门

3.使用解压软件解压struts2-blank.war

4.复制lib下的jar包到自己项目(struts2-blank\WEB-INF\lib)

5.将web.xml中的配置添加到自己项目(struts2-blank\WEB-INF)

6.将struts.xml复制到自己项目并做修改(struts2-blank\WEB-INF\src\java)

<struts>

    <constant name="struts.devMode" value="true" />

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

        <action name="hello">

            <result>

                /hello.jsp

            </result>

        </action>

    </package>

</struts>

 

7.访问http://localhost:8080/struts001/hello

 

3.命名空间

命名空间决定了action的访问路径,命名空间一般和模块名保持一致

Struts2框架入门

4. 指定处理请求的action

<struts>

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

        <action name="hello" class="com.lq.action.HelloAction">

            <result name="success">

                /hello.jsp

            </result>

        </action>

    </package>

</struts>

Struts2的action一般是继承ActionSupport类,默认执行该类的execute()方法

public class HelloAction extends ActionSupport{

@Override

public String execute() throws Exception {

// TODO Auto-generated method stub

return "success";

}

}

5.调用Action中方法的三种方式

案例struts002_method

5.1.为请求指定具体的方法

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

            <result name="success">

                /success.jsp

            </result>

</action>

 

5.2.动态方法调用

user!addUser

感叹号后的addUser指定action中要调用的方法,action中不需要配置method

5.3.通配符

案例:struts003_dynamicmethod

public class UserAction extends ActionSupport{

public String add(){

return "success";

}

public String delete(){

return "success";

}

}

 

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

        <action name="user*" class="com.lq.action.UserAction" method="{1}">

            <result name="success">

                /{1}_success.jsp

            </result>

        </action>

    </package>

访问路径

http://localhost:8080/struts003/useradd

http://localhost:8080/struts003/userdelete

6.参数传递

6.1.属性作为action成员变量

案例:struts004_param

public class UserAction extends ActionSupport{

private String name;

private int age;

public String add(){

System.out.println(name);

System.out.println(age);

return "success";

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

测试:<a href="useradd?name=zs&age=20">接收参数</a>

6.2.model作为action属性

public class UserAction extends ActionSupport{

private User user;

public String add(){

System.out.println(user.getName());

System.out.println(user.getAge());

return "success";

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

}

<a href="useradd?user.name=zs&user.age=20">接收参数</a>

请求是注意是 对象.属性

7.访问web元素

案例:struts006_webElement

访问web元素主要就是获取request  session  application

7.1.实现接口

public class UserAction1 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{

private Map<String,Object> request;

private Map<String,Object> session;

private Map<String,Object> application;

@Override

public String execute() throws Exception {

request.put("k1", "v1");

session.put("k2", "v2");

application.put("k3", "v3");

return "success";

}

public Map<String, Object> getRequest() {

return request;

}

public void setRequest(Map<String, Object> request) {

this.request = request;

}

public Map<String, Object> getSession() {

return session;

}

public void setSession(Map<String, Object> session) {

this.session = session;

}

public Map<String, Object> getApplication() {

return application;

}

public void setApplication(Map<String, Object> application) {

this.application = application;

}

}

7.2.通过ActionContext获取

public class UserAction2 extends ActionSupport{

private Map<String,Object> request;

private Map<String,Object> session;

private Map<String,Object> application;

 

public UserAction2(){

request = (Map)ActionContext.getContext().get("request");

session = ActionContext.getContext().getSession();

application = ActionContext.getContext().getApplication();

}

@Override

public String execute() throws Exception {

request.put("k1", "v1");

session.put("k2", "v2");

application.put("k3", "v3");

return "success";

}

public Map<String, Object> getRequest() {

return request;

}

public void setRequest(Map<String, Object> request) {

this.request = request;

}

public Map<String, Object> getSession() {

return session;

}

public void setSession(Map<String, Object> session) {

this.session = session;

}

public Map<String, Object> getApplication() {

return application;

}

public void setApplication(Map<String, Object> application) {

this.application = application;

}

}

8.配置文件include

案例:struts007_include

实际开发中通常一个模块一个struts配置文件

<struts>

    <constant name="struts.devMode" value="true" />

    <include file="struts_user.xml"></include>

</struts>

9.返回类型result_type

案例:struts008_result

Result最主要的功能是用来完成逻辑地址和物理地址映射, 通过result标签的type属性来设置结果类型,

9.1.Dispatcher

result属性默认值为dispatcher,表示请求转发到指定的jsp页面

9.2.redirect

表示重定向到jsp页面

9.3.chain

请求转发到指定的Action

9.4.redirectAction

重定向到执行的Action

注:当跳转的action不在当前namespace下时可以加参数

<result name="success" type="chain">

    <param name="actionName">r1</param>

<param name="namespace">/user</param>

</result>

9.5.全局配置

<!-- 全局配置,包下的所有action公用这个结果 -->

<global-results>

      <result name="error">/error.jsp</result>

</global-results>

10.ognl

Struts2框架入门

10.1.ognl访问普通属性

案例:struts009_ognl  LoginAction1

10.2.ognl访问对象属性

案例:struts009_ognl  LoginAction2

10.3.ognl访问list集合

案例:struts009_ognl  LoginAction3

10.4.ognl访问web元素

非值栈对象

访问方式

等价访问方式

application

#application.username

application.getAttribute("username")

session

#session.username

session.getAttribute("userName")

request

#request.username

request.getAttribute("username")

parameters

#parameters.username

request.getParameter("username")

attr

#attr.username

pageContext–>request–>session–>application

 

11.struts标签

在使用前需要在页面开始引入标签库,<%@ taglib prefix="s" uri="/struts-tags"%>

1. property标签

property标签提供了一种将属性写到页面的的方法

属性

是否必须

类型

描述

value

Object

需要显式的值,默认为栈顶对象。

default

String

value为空时显式的字符串,默认值为null。

2.set标签

Set标签用于在某个范围内声明一个变量并赋值,或者给一个属性设置别名

属性

是否必须

类型

描述

var

String

别名/引用

value

Object

设置别名代表的表达式或值

scope

String

指定别名被放置的范围,该属性可以接受application、session、request、page或action这五个值,默认值为action,即放在ActionContext中。

 

3.date标签

date标签允许我们用快速简单的方式来格式化一个Date对象

属性

是否必须

类型

描述

format

String

指定日期的格式化格式。

name

Object

指定要格式化的日期值。

4.debug标签

用于辅助调试,它在放置该标签的页面上产生一个超链接,通过该链接可以查看到ValueStack和ActionContext中所有的信息

5.include标签

可以在当前页面中包含其他Web资源的输出

6. if、elseIf/elseif、else标签

用于进行分支控制的,用于根据一个布尔表达式的值,来决定是否输出标签体的内容

 

7. iterator标签

iterator标签用于遍历集合对象

属性

是否必须

类型

描述

value

Object

被遍历的对象。

var

String

每次迭代到的对象以该名字存在于ActionContext中。

begin

int

迭代的开始数值或开始索引。

end

int

迭代的结束数值或结束索引。

step

int

迭代步长。

status

String

当前迭代的状态。当前索引、当前对象的索引是奇数还是偶数等简单的信息,例如:#status.index:当前行的序号,从0开始;#status.odd 是否奇数行。

8. generator标签

generator标签可以将指定字符串按指定分隔符分隔成多个子串组成的集合,类似于split功能

属性

是否必须

类型

描述

val

String

用于分隔的原字符串

separator

String

分隔符

var

String

新集合在page范围中的名字,后续代码可引用。

count

int

用于迭代的最大元素个数。

12.拦截器

Struts2拦截器是AOP的一种体现,每个拦截器代表着一种通用任务,Action业务组件通过使用特定的拦截器将该拦截器的通用任务切入进Action

拦截器的工作流程分为三个阶段

1.做一些Action执行前的预处理任务。

2.将控制交给后续拦截器或调用Action返回结果字符串。

3.做一些Action执行后的后加工任务

Struts2提供了很多内建拦截器,配置信息在struts2-core-2.*.jar包下的struts-default.xml文件中

1. params拦截器

params拦截器用于将请求参数转移到ValueStack公开的属性上

2. servletConfig拦截器

servletConfig拦截器提供了一种将Servlet API对象注入到Action的方法

3. exception拦截器

exception拦截器用于捕获后续执行过程中抛出的异常,exception拦截器会创建一个ExceptionHolder对象存放异常信息,并把它放在ValueStack的最顶端

3. fileUpload拦截器

fileUpload拦截器将要上传的文件及其元数据从多重请求转换为常规的请求参数,让我们既能获得常规数据,也能获得文件数据

13.类型转换

基本数据类型和包装类可以直接转换,事实上我们一直在使用这些内建的类型转换器。