Struts2.docx

上传人:b****1 文档编号:1608790 上传时间:2023-05-01 格式:DOCX 页数:36 大小:3.63MB
下载 相关 举报
Struts2.docx_第1页
第1页 / 共36页
Struts2.docx_第2页
第2页 / 共36页
Struts2.docx_第3页
第3页 / 共36页
Struts2.docx_第4页
第4页 / 共36页
Struts2.docx_第5页
第5页 / 共36页
Struts2.docx_第6页
第6页 / 共36页
Struts2.docx_第7页
第7页 / 共36页
Struts2.docx_第8页
第8页 / 共36页
Struts2.docx_第9页
第9页 / 共36页
Struts2.docx_第10页
第10页 / 共36页
Struts2.docx_第11页
第11页 / 共36页
Struts2.docx_第12页
第12页 / 共36页
Struts2.docx_第13页
第13页 / 共36页
Struts2.docx_第14页
第14页 / 共36页
Struts2.docx_第15页
第15页 / 共36页
Struts2.docx_第16页
第16页 / 共36页
Struts2.docx_第17页
第17页 / 共36页
Struts2.docx_第18页
第18页 / 共36页
Struts2.docx_第19页
第19页 / 共36页
Struts2.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Struts2.docx

《Struts2.docx》由会员分享,可在线阅读,更多相关《Struts2.docx(36页珍藏版)》请在冰点文库上搜索。

Struts2.docx

Struts2

Tomcat环境搭建

Tomcat配置(修改xml在conf文件夹下)

1修改server.xml(解决HttpGet参数为中文乱码)

在Connector标签最后下加入:

URIEncoding="UTF-8"

为:

connectionTimeout="20000"

redirectPort="8443"URIEncoding="UTF-8"/>

2修改context.xml为:

--reloadable=”true”服务器修改后自动重启,记住产品发布的时候不能增加这句!

-->

3增加管理员

例如:

Windows环境搭建

例子:

1JAVA_HOME:

C:

\ProgramFiles\Java\jdk1.6.0_14

2CLASSPATH:

C:

\ProgramFiles\Java\jdk1.6.0_14\lib

3PATH:

C:

\ProgramFiles\Java\jdk1.6.0_14\bin

4TOMCAT_HOME:

E:

\Softwaretools\apache-tomcat-6.0.20

5CATALINA_HOME:

E:

\Softwaretools\apache-tomcat-6.0.20

6CATALINA_BASE:

E:

\Softwaretools\apache-tomcat-6.0.20

 

Struts2的配置(3个步骤)

步骤1.导入最基本的jar包

sturts2-core-2.x.x.jar:

Struts2框架的核心类库

xwork-2.x.x.jar:

Xwork类库,Struts2在其上构建

ognl-2.6.x.jar:

对象导航语言,Struts2框架通过其读写对象属性

freemarker-2.3.x.jar:

Struts2的UI标签的模版使用Freemarker编写

commons-logging-1.1.x.jar:

ASF出品的日志包,Struts框架使用这个日志包来支持Log4j和JDK1.4+的日志记录。

commons-fileupload-1.2.1.jar:

文件上传组件,2.1.6版本后必须加入次文件

commons-io-1..3.2.jar文件上传下载需要

 

步骤2.将struts.xml放到src下

struts.xml配置

代码:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http:

//struts.apache.org/dtds/struts-2.0.dtd">

--

//此struts.xml文件修改后是否立即生效

HelloWorld

/example

-->

--Addpackageshere-->

—作用:

官方宣称中文不乱码,但是还有乱码貌似->

—作用:

修改后不用reload-->

/Hello2.jsp

/Hello.jsp

(绿色是保留部分一边copy,不起作用,红色是修改重点)

步骤3.将web.xml放到webroot下的WEB-INF文件夹下

web.xml配置

代码:

xmlversion="1.0"encoding="UTF-8"?

>

xmlns="

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*//注意,这里只要这么写/*就可以了,这个从始至终都不要改!

 

注意:

struts2.xml被读取后,将以javabean的形式存放在内存中,以后struts2对每个用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件了

 

文件所在

这些struts.xml和web.xml可以在struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF\下找到struts.xml和web.xml和jar包

 

Action注意事项

1更改jsp编码

Window->Perference->JSP(搜索)设Encoding为Chinese,nationstander

2复制struts2项目时注意

Copy后的项目->Property->web(搜索)修改context-root为“/项目名”

Struts.xml增加文件中的提示

由于xml文件,是根据dtd文件来显示的,而dtd文件并不为MyEclipse所知道,所以要手动的指定dtd所在的位置。

属性中搜索catalog(登记)

将struts的uri复制到key中

Location是那个Struts-2.0.dtd文件的位置(这个文件可以在lib\struts2-core-2.1.8.1.jar解压后找到)

Ok即可

Struts的运行机制

任何的运行机制都要从访问的网址开始:

例如:

http:

//localhost:

8888/Struts2Test/hello

首先Tomcat会去寻找Struts2Test这个web站点,然后在这个站点中查看web.xml的配置

发现配置如下:

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*

他用/*来匹配所有的访问,则filter调用doFilter,doFileter要参考struts.xml,因此找到struts.xml

查看struts中的namespace“/”,再在namespace为“/”之后查看有没有hello的action,有就直接输出result

NameSpace

namespace是为了较少繁琐的定义路径而设置的

namespace如果不写,就是默认为空:

namespace=””;

如果为空,则namespace匹配所有的url中namespace。

类似*号一样。

例如:

http:

//localhost:

8888/1/2/3/4/hello

/1/2/3/4就是可以被空的namespace所匹配。

package与java中的package相似,这里的主要功能是在继承的时候要用的package的name属性,还有用来区分相同的名字。

如果一个package被定义为abstract,则这个包只能被继承,不能定义任何的action

路径问题1(namespace路径问题)

如果访问的路径中的namespace,Struts.xml没有相对应的namespace,则就交给Tomcat去找web.xml是否有相应的设置,如果有就使用例如:

index.jsp

就根据它来显示了(其实我试过很过都不行,只有部分可以)

路径问题2(相对和绝对路径问题)

这里要注意:

要全部使用绝对的路径,否则会有问题:

问题例子:

如果你的namespace设置为:

/rotoy要访问的action为hello,hello显示的页面为hello.jsp,index.jsp和hello.jsp是同一目录,都在WebrRoot下面。

而hello.jsp中有一个连接为:

 跳往index.jsp

则URL为:

http:

//localhost:

8888/rotoy/hello访问正常,

但是如果点击hello.jsp中的连接,前往index.jsp的时候就出现错误了,找不到页面!

分析:

hello.jsp和index.jsp在同一个目录下面,应该用那个相对路径可以访问的,那为什么出现错误呢?

原因是:

由于程序只知道的是当前的路径,你访问的是hello.jsp则当前的路径是:

http:

//localhost:

888/rotoy,如果你直接点击那个相对路径,则就访问了http:

//localhost:

8888/rotoy/index.jsp页面了,它是在当前的目录寻找,所以就出错了,所以那个连接最好是设置为绝对路径

Action学习内容简要回顾

实现一个Action的3种方法:

1.直接定义一个普通类,有一个返回String类型的execute方法

2.实现Action接口(ActionSupport也是实现此接口)

3.继承ActionSupport接口(最常用,开发时候只用它,

原因:

它封装了许多方法,实现它可以用它的方法

struts2调用每个action的类的时候是new一个出来,不是像struts1一样,用相同的一个,这样就避免了线程同步的问题。

 

查看ActionSupport的源码

如果一个ation没有写class属性,则默认执行的是AtionSupport这个类,这个类用到了另外的一个框架->xwork

如果要看ActionSupport的源码,必须要给xwor-2.1.X.jar文件附加源码

ActionSupport也是执行的是execute方法,返回success

ActionSupport实现了Action接口

DMI动态方法调用(DynamicMethodInvocation)

运用感叹号(!

)于Action后面来调用Aciton的Class属性所指向的类中的方法

如:

http:

//localhost:

8888/T/abc/abc!

text?

name=abc&age=20

解:

其中T为一个站点

第一个abc为namespace

第二个abc为action

则text为action类中的一个方法

name和age是向ation类中传递的2个参数

age会自动的在int和String中转换

注意:

struts.xml中配置的文件中的我们要把它和那个他对应的那个类想成同一个,因为那个类也是一个action,他们指的是同一个的不同映射结果!

不要把它想成:

配置文件中的action,然后这个action对应一个类!

不知这样的!

他们是同一个!

通配符

例如:

/ShowResult.jsp

如果访问:

http:

//localhost:

8888/Student/studentadd

那么student就匹配了studentadd,*部分就匹配了add

{1}代码第一个*,{2}代表第二个*……

那么method=”add”了,就是*匹配了add

注意!

匹配顺序:

先匹配最精确的action(就是最符合,最相像的)

带有*号的属于同一级别,谁前谁的优先级别大。

Action接收参数的方法

例如:

访问的地址为:

http:

//localhost:

8888/T/abc/count!

add?

name=abc&age=3

则:

countactionMapping的class中接收:

1用属性接收

1解:

在传递的属性很少时,用属性接收

具体:

要在class中定义好name和age的getter和setter

Struts2会自动的调用并且赋值,我们直接调用name和age即可

例如:

访问的地址为:

http:

//localhost:

8888/T/abc/count!

add?

man.name=abc&man.age=3

2用DomainModel接收

所谓的DomainModel就是一个DAO(应该是吧),用来传输数据中一个容器类

2解

可在传递的属性比较多时使用

定义一个DomainModel(另一个类,如man类)

里面定义好属性(name和age),和属性的getter和setter方法

在class中定义好这个DomainModel(即man不初始化),和man的gettersetter方法

Struts2会自动的设置这个man的name和age属性,我们调用即可

用URL来给于参数,调用的URL:

http:

//localhost:

8888/rotoy/add!

man.age=22&&man.name=Rotoy

注意:

action类中要有man的getter和setter方法

man中要有age和name的getter和setter方法

 

中文参数问题

如果Struts提交的参数是中文会有乱码

官方解决:

其中的

是官方的解决方案。

配置方法,参看default.properties

简单的参数验证

例如:

class中的name属性接收时不满足条件

由于Struts中的class没有request等的对象,所以只能

在class中调用:

this.addFieldError(“name”,”Errormsg”);

JSP中接收

1先在顶端加:

<%@tagliburi=”/struts-tags”prefix=”s”%>

2调用

filederrorfielName=”name”theme=simple”/>

debug>//显示debug信息

 

property>

property>的作用是专门去取得:

和StackContext(也叫ActionContext)

中的值

ValueStack中放的是:

错误信息和Action类中的属性。

 

其中

中的:

其中[]是指的数组,{}指的是:

map类型的,{[]}明显是就map中的数组。

Action访问Web元素方法1

Action将要取得:

 

便于记忆

其中有request(map类型),和session(map类型),application(map类型)放在valuecontext中(也叫Actioncontext,其实是ThreadLocal对象,ThreadLocal就是一个Thead和其值)

而Action中的属性是放在valueStack中的。

这就类似于jsp:

他的page相当于valuesatck中的属性,其他的request,session,application和Action的一一相对应,这样便于记忆。

获取action的web元素:

单态模式:

例如:

ActionContext.getContext.get(“request”);

其中:

ActionContext是静态引用,ActionContext.getContext是获得Action Context(ValueContext)的实例。

ActionContext.getContext.get(“request”)是根据key获得request,还可以获得session,和Accpplication

方法分别为:

(由于取得的方法不同,所以只有request要强转)

获取后可以在Action中使用:

Jsp中可以取得:

关于:

propertyvalue=”#request.r1”/>的写法

由于有说明:

所以可以用#来取值。

(valuestack中的直接取得,不用#)

注意细节:

在action中的requestsessionapplication都是map类型的,在jsp页面中可以取得,说明Struts在这个过程中,已经将action中的map类型的web元素,完全复制到了jsp中的HttpRequsest,HttpSessionHttpApplication中了

Action访问Web元素方法2

Ioc或者DI(最常用)

InversofControl(控制反转)

DependencyInjection(依赖注入)依赖struts2

解释:

都是将自己的属性交给别人来操作,所以依赖别人,叫DI,

有因为交给别人操作是把控制权交给别人,所以是IoC

 

Action实现了RequestAware,SessionAware,ApplicationAware这些接口,然后重写里买呢的

setRequest(),setSession();setApplication()方法。

就可以获得他们了

tip:

其实真正开发reuqest几乎不用去获取,因为action的值会自动的放在valuestack里面,

而valuetack又是在request里面!

而application也不用,需要长久的话用数据库,或者放在一个类中。

 

之前都是map的request等,

如何获得真实HttpRequest呢?

如图:

(因为几乎不用,所以只给图代码)

方法1;

方法2

 

总结访问web元素

1访问Map类型

a)IoC(反转控制)(主要方法)

b)依赖Struts2

2访问原始类型(真实类型)

a)IoC(反转控制)

b)依赖Struts2

 

模块包含

如:

//完全复制login.xml内容到这里

这样是为了分工合作比较好。

 

默认Action

当输入的action不存在时,都转向这个action

Result的类型

注意:

type=chain时候的result是指向action的,前面不要加/

默认是dispatcher:

forward)服务器跳转(只能跳转页面,不能是action)(就这2个常用)

redirect:

客户端跳转(只能跳转页面,不能是action)(就这2个常用)

chain:

服务器跳转action(了解即可)

redircAction:

客户端跳转action(了解即可)

freemarker:

跳到freemarker页面(后面讲)

httpheader:

发送头信息(不用)

stream:

下载(后面讲)

velocity:

freemarker类似的模版框架(抛弃,freemark超过它)

xslt:

与xml相关的xml语言(不用)

plaintext:

将页面源码显示出来(不用)

tites:

页面分成几块(不用)

result为chain或者redircAction时候跳转其他包的action

来指定

 

全局的result和package的exends

如果每个action都有一个相同的action,都写麻烦,用global-result

只要配置了这个global-result,这个package的每个action不用写,都有了

那其他的包要用extends来继承这个包的配置,这个继承是继承那个包的所有的配置,所以包括了那个全局结果集

 

动态result

在struts.xml文件中可以用${属性名}来获取valuestack中的值。

不要和el表达式混淆,el是用在jsp中的

如果在action中将这个变量r根据情况设置,那么就是动态的结果了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2