struts2(1)

框架结构

1、web层
以前所使用的技术为servlet,和jsp。现在将servlet换为struts2 [st’rʌts]
2、server层
JavaBean
3、dao层
Hibernate

spring贯穿三层(将spring理解为容器,存放三层的对象)

struts2的优势

自动封装参数
参数校验
结果的处理(转发、重定向)
国际化
显示等待页面
防止表单的重复提交

struts2历史

区别:从技术上来讲,struts1(由线程不安全的servlet构建)和struts2(前身是webwork,后与struts1作者合作,改名为struts2,核心为filter即过滤器)没有关系

搭建框架

导包

struts2文件夹中给出了所有的包,但是我们有些用不到。我们可以将基本演示项目(struts-2.3.24\apps\struts2-blank.war【解压打开】)中的包导入。这些包就是基本必须包

书写Action类

新建一个类,须以Action结尾

1
2
3
4
5
6
7
8
package me.yanrs.a_hello;

public class HelloAction {
public String hello(){
System.out.println("Hello");
return "success";
}
}

书写src/struts.xml

dtd文件约束引入(以struts2的为例)

Library -> Web App library -> struts2-core-2.3.24.jar -> struts-2.3.dtd -> 找个地方新建一个文件,文件名为struts-2.3.dtd,并将其中内容复制到新建的文件中(不能拷贝,只能通过新建,复制内容的方式) -> eclipse -> Windows -> Preferences -> 搜索cate -> XML Catalog -> Add -> Location 选择刚刚保存的dtd文件,Key type选择URL路径 -> key为dtd文件中的url路径。到此dtd的引入就成功了。

配置
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="hello" namespace="/hello" extends="struts-default">
<action name="HelloAction" class="me.yanrs.a_hello.HelloAction" method="hello">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>

创建对应的jsp

创建hello.jsp 内容为hello world!

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
hello world!
</body>
</html>

web.xml配置核心过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts_1</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- ctrl+shift+t 搜索 strutspre 即可查询到,赋值即可 -->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

访问流程以及架构

struts2架构以及访问流程

访问流程

http://localhost:8080/struts_1/hello/HelloAction ( hello为命名空间 )【struts_1是项目的名称,hello是namespace的名称,HelloAction是类的名称】

浏览器发送请求

经过过滤器

寻找struts配置文件

将命名空间名 hello 和 namespace 进行匹配

寻找名称为 HelloAction 的 Action

拿到类的完整类名称,创建出相应的对象

寻找对应的方法,并调用

获取到方法的返回值,并回到struts配置文件,寻找name为返回值的result

转发到result中对应的页面

架构

图没传,太大,后期加图床。

学习流程

灰色为框架自带,不需要实现。红色为需要自己实现,绿色为可选择实现)

struts.xml配置详解

package: 将Action配置封装(其实就是可以在Package中配置很多Action)
package的name: 给包其名字,起到标识作用,随便起,不重复就行。
package的namespace: 给action的访问路径中定义一个命名空间。
package的extends: 继承一个指定包。
package的abstract: 标识属性,表示包不能独立运行,专门被继承。

action的name: 决定了action访问资源名。
action的class: action的完整类名。
action的method: 指定调用action中的哪个方法来处理请求。

result的name: 标识结果处理的名称,与action方法的返回值对应。
result的type: 指定调用哪一个result类来处理结果。(默认使用转发)

inlude:多个struts.xml的配置方式(struts.xml文件可以有多个,只需在src下统一引入即可)

1
2
<!-- 在src下引入 me/yanrs/dynamic/下的struts.xml配置文件   -->
<include file="me/yanrs/dynamic/struts.xml"></include>

struts2常量配置

默认常量配置位置

Library -> Web App library -> struts2-core-2.3.24.jar -> org.apache.struts2 -> default.properties

修改struts2常量配置方式(方式顺序也是加载顺序)

方式1 (重点)

可以在 struts.xml 中,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<!-- 在struts.xml中配置struts2常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>

<package name="hello" namespace="/hello" extends="struts-default">
<action name="HelloAction" class="me.yanrs.a_hello.HelloAction" method="hello">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>

方式2

可以在src下新建文件为struts.properties,在里面配置即可。

方式3

可以在 web.xml 中,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts_1</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- ctrl+shift+t 搜索 strutspre 即可查询到,赋值即可 -->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 在web.xml中配置struts2常量 -->
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

修改常量配置(在struts.xml中的方式)

struts.i18n.encoding: 国际化,解决post提交的乱码。

1
<constant name="struts.i18n.encoding" value="UTF-8"></constant>

struts.action.extension: 配置访问时,url中action的后缀名。例如:将后缀名分别配置为.do和.action

1
2
<constant name="struts.action.extension" value="do"></constant>
<constant name="struts.action.extension" value="action"></constant>

struts.devMode: 配置struts2是否以开发者模式运行

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

struts2配置的进阶

动态方法的调用 (重点)

方式1

通过配置 struts.enable.DynamicMethodInvocation 的方式。默认为false。此方式不利于seo优化。

1
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

使用,比如现在action中,有四个方法,分别是增、删、改、查。那么如果要在struts.xml中配置能访问调用这四个方法,按照以前的方法就得在struts.xml中配置四个package,方法分别对应为增、删、改、查。简便的方法就是配置struts.enable.DynamicMethodInvocation,使用的时候只需在url中采用! + 方法名 + 后缀的方法访问即可。

struts.xml完整配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<!-- 在struts.xml中配置struts2常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

<package name="dynamic" namespace="/dynamic" extends="struts-default">
<action name="dynamicAction" class="me.yanrs.dynamic.dynamicAction">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>

Action类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package me.yanrs.dynamic;

public class dynamicAction {
public String add(){
System.out.println("增加");
return "success";
}

public String del(){
System.out.println("删除");
return "success";
}

public String modify(){
System.out.println("修改");
return "success";
}

public String search(){
System.out.println("查询");
return "success";
}
}

访问的url

1
2
3
4
5
6
7
8
9
10
11
查询
http://localhost:8080/struts_1/dynamic/dynamicAction!search.action

增加
http://localhost:8080/struts_1/dynamic/dynamicAction!add.action

删除
http://localhost:8080/struts_1/dynamic/dynamicAction!del.action

修改
http://localhost:8080/struts_1/dynamic/dynamicAction!modify.action

方式2(重点)

使用通配符的方式

struts.xml完整配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<!-- 在struts.xml中配置struts2常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.devMode" value="true"></constant>

<package name="dynamic" namespace="/dynamic" extends="struts-default">
<action name="dynamicAction_*" class="me.yanrs.dynamic.dynamicAction" method="{1}">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>

Action类

1
同方式1

访问的url

1
2
3
4
5
6
7
8
9
10
11
增加
http://localhost:8080/struts_1/dynamic/dynamicAction_add.action

删除
http://localhost:8080/struts_1/dynamic/dynamicAction_del.action

修改
http://localhost:8080/struts_1/dynamic/dynamicAction_modify.action

查询
http://localhost:8080/struts_1/dynamic/dynamicAction_search.action

struts2中的默认配置 (默认值,可选择性配置)

method属性: 默认值为execute(也就是说,如果action中的方法如果为execute,那么此项可以不配置)
result的name属性: 默认值为success(如果action中的返回值为success,那么此项可以不配置)
result的type属性: 默认值为dispatcher(默认转发)
class属性:默认值为
配置默认的action

Action类详解

方式1

1
2
3
4
5
6
7
8
9
10
11
package me.yanrs.create_action;
/*
* 方式1,这个类可以是POJO
* POJO: 不用继承任何父类,也不需要实现任何接口
* 好处:使得struts2框架的侵入性更低
*/
public class DemoAction1 {
public String add() {
return "success";
}
}

方式2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package me.yanrs.create_action;

import com.opensymphony.xwork2.Action;
/*
* 方式2: 实现一个Action接口
* 复写execute方法,提供action方法书写的规范
* Action接口预置了一些字符串,可以在返回结果时使用
*/
public class DemoAction2 implements Action{

@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return null;
}

}

方式3 (重点)

1
2
3
4
5
6
7
8
9
10
11
12
13
package me.yanrs.create_action;

import com.opensymphony.xwork2.ActionSupport;

/*
*方式3:继承了一个类,ActionSupport
*帮我们实现了 Validateable, ValidationAware, TextProvider, LocaleProvider
*如果我们需要用到这些接口的时候,直接使用就好
*/
public class DemoAction3 extends ActionSupport{

}
书写src/struts.xml

crm客户列表的实现

其他

如何快速的调用重写接口,toString等选项,快捷键为 alt + shift + s
如何查看某个方法在哪个包下,在eclipse中,在文件列表栏目上方,选择双向小箭头,在按住ctrl点击方法名,文件栏就能实现跳转。