lab10Struts2入门.docx
- 文档编号:7845687
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:23
- 大小:762.30KB
lab10Struts2入门.docx
《lab10Struts2入门.docx》由会员分享,可在线阅读,更多相关《lab10Struts2入门.docx(23页珍藏版)》请在冰豆网上搜索。
lab10Struts2入门
Lab10Struts2入门
实验目标
本实验将练习Struts2的简单实用,初步熟悉Struts2框架的应用方法。
首先创建简单的HelloWorld,再通过一个用户登录程序进行稍微复杂的开发。
建议参考Struts2自带文档:
struts-2.3.4.1/docs/WW/hello-world.html
实验准备
1.下载Struts2压缩包。
到Struts官方网站http:
//struts.apache.org/下载,这里下载的是struts-2.3.4.1-all.zip。
2.解压Struts2压缩包到磁盘目录G:
\tools\Java\struts-2.3.4.1,以下将该目录简称为STRUTS2_HOME,下有4个子目录:
✧apps:
应用样例包,包含多个可以直接部署的Web应用包。
✧docs:
文档,包含了FAQ、开发手册及API等所有关于Struts2的静态文档。
可以打开首页浏览:
STRUTS2_HOME\docs\WW\index.html。
✧lib:
库文件,包含了Struts2发行的所有JAR文件以及运行Struts2时所依赖的JAR文件。
很多,开发时根据需要添加到自己的项目中。
✧src:
源文件,包含了Struts2发行JAR文件的源文件,自带WEB应用样例的源文件等。
3.IDE:
使用EclipseforJavaEE
Exercise1:
HelloWorld
Step1创建Web工程
01创建Web工程HelloWorld。
通过菜单“File->Other”打开“New”对话框,如图10.1所示。
02在“New”对话框中选择“Web->DynamicWebProjects”,点击“Next>”打开对话框“NewDynamicWebProject”,输入项目名称HelloWorld和存放位置,如图10.2所示。
03点击“Next>”,在弹出的对话框中设置源程序目录和编译后输出目录。
这里将缺省输出目录设置到“WebContent\WEB-INF\classes”,WebContent作为工程构建后的Web应用根目录,它符合JavaEE的目录规范。
如图10.3所示。
04点击“Next>”,在弹出的对话框设置Web模块信息,这里将Web模块的上下文root设置为工程名HelloWorld,Web程序的内容目录设置在WebContent。
设置后向导将在工程目录下创建WebContent目录,并以HelloWorld名称发布在Tomcat中。
如图10.4所示。
05点击“Finish”,完成工程创建。
工程目录结构如图10.5所示。
如果要浏览项目所有目录的树形结构,可以通过菜单“Windows->ShowView->Navigator”打开Navigator视图。
如图10.6所示。
图10.1选择创建的工程类型
图10.2选择创建的工程类型
图10.3设置缺省的编译输出目录
图10.4设置Web模块
图10.5项目结构-ProjectExplorer图10.6项目结构-Navigator视图
这里需要注意的是关于Java源程序的编译输出目录路径。
在Eclipse创建Web项目的向导中,新建项目缺省的编译目标位置是build/classes,但标准Web应用要求编译后的JavaClass文件在WebContent/WEB-INF/classes目录中,若在向导中未作设置,可以在项目创建完成后进行设置。
右击项目,选择“Properties”打开项目属性对话框,如图10.7所示。
在项目属性对话框中,选择左侧“JavaBuildPath”,右边选择“Source”标签,修改输出目录。
完成后可删除build目录。
图10.7修改项目属性
Step2配置Struts2
导入Struts2的JAR文件。
一种方式是,打开项目属性对话框,选择“JavaBuildPath->Libraries”,点击按钮“AddExternalJARs”,选择Struts2包解压后的lib目录下的相关JAR文件即可。
这种方式的缺点在于,如果Struts2包解压后的lib目录发生改变,这里的设置也需要修改。
另一种方式是在Eclipse中设置一个Struts2的用户库,包含相关的JAR文件。
这样在其他项目中也可以通过这个用户库直接导入相关的库文件。
但是对有的项目来说,可能不需要这个用户库中所有的JAR文件,这样又会造成一些冗余。
这里直接将本例需要用到的相关JAR文件拷贝到WebContent/WEB-INF/lib下即可。
可以将STRUTS2_HOME/apps/struts2-blank.war解压后,将其子目录WEB-INF/lib下的所有JAR文件复制过来即可。
最后目录结构如图10.8所示。
图10.8加入Struts2库文件后的项目结构
编辑web.xml。
配置Struts2的拦截器。
可以将STRUTS2_HOME/apps/struts2-blank.war解压后的子目录WEB-INF下的web.xml拷贝过来进行编辑。
xmlversion="1.0"encoding="UTF-8"?
>
xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns="xmlns: web="xsi: schemaLocation="id="WebApp_ID"version="2.5"> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 提示: Struts2的拦截方式 在缺省情况下,Struts2的拦截器并不对以“.html”、“.css”、“.js”等为后缀的请求进行处理,它处理的是以“.action”结尾的用户请求。 提示: 文件上传时增加一个filter 在做上传文件时,需要在web.xml中增加一个filter即ActionContextCleanUp,用于在部署之前先清除环境,如果缺少这个filter,会发生在第一次上传取不到文件的情况。 创建struts.xml。 这是Struts2的核心配置文件,Struts2运行时会自动到运行环境的类路径(classpath)中寻找名称为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"> --Addactionshere--> --Addpackageshere--> 提示: 配置文件的位置 Struts2的配置文件通常放到项目的src目录下,这样在编译时就会被自动复制到目录WebContent/WEB-INF/classes下,该目录在Web应用运行时会被增加到classpath中。 上面用到的配置文件struts.xml和web.xml都可以从Struts2的发行包中的struts2-blank样例包中拷贝到项目中再修改。 Step3编写视图页面 现在来创建JSP页面作为视图,本例中包含两个页面: index.jsp和HelloTime.jsp。 Struts2可以灵活的支持多种视图,除了JSP外,对于其他的表示层技术,例如Velocity,JSF,JFreeChart,SiteMesh等都提供了很好的支持。 创建首页index.jsp。 在WebContent目录下创建。 DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
Loading...
创建HelloTime.jsp。
在WebContent/pages目录下创建。
通过菜单“File->Other”打开“New”对话框,选择“Web->JSPFile”,点击“Next>”,打开“NewJSPFile”对话框,选择目录,输入文件名,点击“Finish”完成。
如图10.9所示。
打开新建的HelloTime.jsp文件,编辑内容,添加“message”和“currentTime”两个属性字段的显示。
图10.9创建JSP页面文件
<%@pagecontentType="text/html;charset=UTF-8"%>
<%@taglibprefix="s"uri="/struts-tags"%>
propertyvalue="message"/>
propertyvalue="message"/>
Currentdateandtimeis:
propertyvalue="currentTime"/>
说明:
该页面中,通过Struts2提供的
propertyvalue="currentTime"/>就是输出Action的getCurrentTime()方法所返回的信息。 从这里可以看出,在Action中并不一定必须有与之相对应的同名属性。 Step4创建Action 创建HelloTimeAction.java。 Action类用来执行具体的操作,生成页面显示所需要的数据,而页面则负责显示Action中所设置的数据。 Struts2中不再要求Action必须继承自某个公共的Action基类,但是Struts2还是提供了一些Action的基类,在这些基类中提供了在Action中常用的一些方法并实现了一些常用的功能接口。 下面创建com.nit.struts.action.HelloTimeAction类,继承自ActionSupport类。 其中包含一个属性message,用于存储输出到页面的提示信息。 而getCurrentTime()方法则返回当前的时间供页面去显示。 packagecom.nit.struts.action; importcom.opensymphony.xwork2.ActionSupport; importjava.util.Date; publicclassHelloTimeActionextendsActionSupport{ publicstaticfinalStringMESSAGE="Struts2HelloTimeTutorial! "; publicStringexecute()throwsException{ //设置显示到页面的信息 setMessage(MESSAGE); returnSUCCESS; } privateStringmessage; publicStringgetMessage(){ returnmessage; } publicvoidsetMessage(Stringmessage){ this.message=message; } publicStringgetCurrentTime(){ returnnewDate().toString(); } } 提示: 通过标记访问Action属性 页面中的标记在获得Action所提供的数据时,并不是访问具体的属性,而是通过相应的getXXX()方法来进行访问。 所以这里获得当前时间并未定义相应的属性。 检查struts.xml。 再次查看struts.xml中关于Action的配置。 Step5运行HelloWorld程序 运行程序。 输入URL: http: //localhost: 8080/HelloWorld,查看运行结果,如图10.10所示。 图10.10HelloWorld程序运行结果 提示: 访问Action的URL 在Struts2中,访问Action的URL是与 具体URL的组成如下所示: http: //IP: port/Web应用名称/namespace/Action名.action 对应于本应用的Action的访问URL为: Step6原理剖析 在本例中,Struts2处理请求的过程如下: ①浏览器请求http: //localhost: 8080/HelloWorld,发送到Web服务器,服务器响应欢迎页面index.jsp,该页面实际再发送请求: http: //localhost: 8080/HelloWorld/pages/HelloTime.action。 ②容器接收到Web服务器对资源HelloTime.action的请求,根据web.xml中的配置,服务器将包含有.action后缀的请求转到StrutsPrepareAndExecuteFilter类进行过滤处理。 通过调用该过滤器,进入Struts2的流程中。 ③框架在struts.xml配置文件中查找名为HelloTime的action对应的类。 框架初始化该Action并且执行该Action类的execute方法; ④execute方法将信息设置到message属性中,并返回成功。 ⑤框架检查配置文件以查看当返回成功时对应的页面。 框架告诉容器来获得请求返回的结果页面HelloTime.jsp; ⑥标签 propertyvalue="message"/>调用HelloTime所对应的HelloTimeAction类中的getMessage()方法来获得message的值。 ⑦标签显示message并以HTML格式呈现给用户。 Exercise2: 添加用户登录功能 Step1准备工作 本例将在上一个例子基础上添加用户登录功能。 首先为用户提供一个登录页面,然后校验用户输入信息是否合法,如果正确就返回登录成功页面,否则就返回登录页面,并给出相应的提示信息。 实现功能之前,首先要设计好程序的流程,规划好页面和后台Action之间的调用和跳转关系。 如图10.11所示。 图10.11用户登录程序流程图 添加登录链接。 编辑HelloTime.jsp,添加一个登录的链接。 urlid="url"action="toLogin"> url> ahref="%{url}">Login a> 这里的标记 url>用于生成一个URL地址,可以使用标记指定追加到URL的请求参数。 例如: urlid="url"action="HelloWorld"> paramname="request_locale">en param> url> ahref="%{url}">English a> 注意: 这里以“s: ”作为前缀的标记是Struts2中设计的自定义标记,使用这些标记可以帮助完成一些常用的繁琐的工作。 Step2定义JavaBean Web应用中经常要处理表单提交的数据及其存储。 如果用户提交的数据较少,那么可以不定义任何JavaBean对象,通过直接在Action中增加相应的属性就可以获得用户提交的数据;但若数据较多时,会造成Action过于臃肿,并且当用户提交的数据项目发生变化(需求变更)时,就需要对Action进行修改。 Struts2支持用Java对象来获得用户提交数据。 这里我们定义一个User对象,只简单的包含用户名和密码两个属性及其setter/getter。 下面创建com.nit.struts.bean.User类。 packagecom.nit.struts.bean; publicclassUser{ privateStringusername; privateStringpassword; //getters/setters... } Step3创建LoginAction 与Struts1不同,Struts2中Action不再是单例模式,所以每个用户请求都使用自己的Action实例,因而在Action中定义属性用于保存用户提交的数据。 Struts2框架在运行时会依据规则将用户提交的数据自动注入到Action的相应属性中。 因此,在LoginAction中,为了获得用户提交的用户名和密码参数,可以在Action中定义属性username和password;但由于Struts2支持更高级的POJO访问(厉害! ),我们可以在Action中定义一个User对象的实例并提供相应的getter/setter即可。 具体用户请求的处理是通过execute()方法来实现的,其返回值表示返回给用户的结果(result)名称,对应于struts.xml中相应 下面创建com.nit.struts.action.LoginAction类,继承自ActionSupport类。 packagecom.nit.struts.action; importcom.opensymphony.xwork2.ActionSupport; importcom.nit.struts.bean.User; publicclassLoginActionextendsActionSupport{ privateUseruser; publicStringexecute()throwsException{ if(isInvalid(user.getUsername())|| isInvalid(user.getPassword())){ addActionError("Invalidusernameorpassword! "); returnINPUT; } addActionMessage("WelcometomyStruts2App! "); returnSUCCESS; } privatebooleanisInvalid(Stringvalue){ return(value==null||value.length()==0); } publicUsergetUser(){ returnuser; } publicvoidsetUser(Useruser){ this.user=user; } } 代码说明: ✧这里在LoginAction中定义了一个User类型的属性,这样可以用它来存储更多的用户数据,如用户名、密码等等。 如果不这样的话,那么对于每一个用户数据,都需要在Action中创建一个对应的属性,这会使Action变得臃肿。 ✧使用自定义的User类型的属性user时,为了使Struts能自动将表单数据设置到这个属性user中,页面表单中的控件名称需要遵循一定的规则。 例如: 用户名输入框的名字应为“user.username”,对应于属性user对象的属性username,命名须保持一致。 同理,在页面中需要对应显示Action中属性的数据时,也需要遵循这种规则。 ✧在LoginAction中定义了一个方法execute()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lab10Struts2 入门