J2EE--Struts2基础开发笔记
可以说SSH三大框架的东西内容非常非常多,并且这三个框架通常是整合应用的,要完整且详细地说实在是不太可能,平时真正要用的时候还是要去看这些框架本身提供的帮助文档,讲解都是非常细致的,而且带有使用范例。
这些框架如果不是实际应用的话,学了还是一样会忘。
其实我们学习还是习惯先知道这个工具到底怎么用,然后学到一定熟练度了,觉得遇到瓶颈了,我们就应该回去学学底层的东西,了解一下它们的实现原理(Java反射)。
所以这里就先做一下Struts的基本使用方法的笔记。后面会补充其他两个框架单独应用的笔记以及三个框架整合应用的笔记,最后还有时间的话就写下原理相关的笔记。
J2EE相关设计的例子均改写自李刚的《轻量级J2EE企业应用实战》。开发环境为Ubuntu+Eclipse-j2ee。
下面写的示例大部分是自己在文本中编写和新建,然后在Eclipse中按F5刷新工程结构,原始方式和编译器的结合使用。
准备好struts2需用的文件,这个去网上下载即可,解压后得到如下结构文件夹:
其中src文件夹包含了struts全部框架的源代码。
Docs文件夹包含了struts的帮助文档。
Lib文件夹包含了struts提供的类库。
Apps文件夹包含了多个示例应用的压缩包。
准备文件:
我们抽取一下构建一个基础struts应用所需要的核心类库:
以上文件放置到WebContent/WEB-INF/lib内。
我们先在Eclipse中新建一个Web应用(Dynamic web Project)。实际上,不管这个应用多大,它的基础文件结构仍然是可以归纳如下:
首先我们将常用的类库放入lib文件夹(复制粘贴即可),并在Eclipse中引入(F5) 。
然后,在web.xml文件里定义一下struts过滤器,这样的话浏览器客户端用户发送的请求就会被struts拦截,接着由struts定义的规则进行处理。
新建项目的时候Eclipse可以勾选自动生成web.xml文件,当然这个我们后面自己新建即可。
Eclipse编译器会在项目根目录下生成一个src文件夹,我们只需要将原本要配置在classes文件夹下的文件全部先放入src文件夹,如果项目能够正常运行,那么项目根目录下就会生成一个build文件夹,部署应用到服务器的时候,将build文件夹里面的所有文件均放入WEB-INF/classes里面即可,实际上文件夹内就是java成功编译后生成的class字节码文件。
整理好文件结构以后,拿到tomcat服务器去部署即可。后面再细说。
然后我们去struts压缩包解包后的src文件夹下的apps文件夹里搜一搜比较标准的web.xml。
web.xml配置:
Ubuntu下用find命令找到一个看起来可以参考的:
打开来参考下,我们这个例子配置如下内容即可。
文件路径应为WebContent/WEB-INF/web.xml。
<?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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>NeroStrutsTest</display-name> <!--配置应用的默认页面--> <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> <!-- 配置struts核心过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
经过web.xml的配置,我们已经可以用struts拦截用户请求,下面我们来看看拦截请求以后如下作基本的处理。
编写默认访问页面:
首先,我们定义一个基础页面WebContent/index.jsp供用户访问:
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title><s:text name="loginPage"/></title> </head> <body> <s:form action="login"> <s:textfield name="username" key="user"/> <s:textfield name="password" key="pass"/> <s:submit key="login"/> </s:form> </body> </html>
可见,通过<%@taglib prefix=”s” uri=”/struts-tags”>声明了struts的标签。
在此我们引入了两个元素,一个是username,一个是password,后面写负责响应功能的的JavaBean的时候,注意数据成员的名称应该和这两个元素相对应。
另外,注意到页面上标签上的各个字段,比如name=”loginPage”、key=”user”什么的,为了支持国际化,使页面在英文和中文环境下都能正常显示,我们在NeroStrutsTest/src下新建一个资源文件messageResource.properties:
通过jdk自带的native2ascii工具生成ascii码文件,可以先将该工具复制到properties文件的同一目录下:
先用cd命令将工作目录转到你需要的路径,比如:
cd /home/nerohwang/J2EEWorkSpace/Nero
假设这个路径里同时存放了从jdk包里面取过来的native2ascii工具和新建的messageResource.properties文件,使用native2ascii工具命令如下:
native2ascii messageResource.properties messageResource_zh_CN.properties
生成结果如下:
定义响应类:
NeroStrutsTest/src/nero/LoginAction.java
package nero; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ActionContext; //Struts2的Action继承了ActionSupport public class LoginAction extends ActionSupport { //定义封装请求参数的username和password属性 //这两个属性应该和用户请求页面index.jsp的<s:textfield>标签中的name属性值对应! private String username; private String password; //编写setter方法和getter方法,如果使用eclipse编译器可以自动生成 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //定义处理用户请求的execute方法,用户响应在该方法内执行 //返回值SUCCESS和ERROR为Action类中的常量数据成员,对应字符串"success"和"error" public String execute() throws Exception { //简单判断是否对应 if (getUsername().equals("nero") && getPassword().equals("nero") ) { //将登录的用户名放入session范围内 ActionContext.getContext().getSession().put("user" , getUsername()); return SUCCESS; } else { return ERROR; } } }
通过重写上面的excute()方法,作出对用户请求的响应。在此,用户请求的action是直接请求javaBean(模型),而直接跳过了控制器,这样也是一种办法。
配置Struts.xml:
定义完响应类,我们在NeroStrutsTest/src文件夹下自行编写struts.xml配置文件:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <!-- 指定Struts 2配置文件的根元素 --> <struts> <!-- 指定全局国际化资源文件base名 --> <constant name="struts.custom.i18n.resources" value="messageResource"/> <!-- 指定国际化编码所使用的字符集 --> <constant name="struts.i18n.encoding" value="GBK"/> <!-- 所有的Action定义都应该放在package下 --> <package name="nero" extends="struts-default"> <action name="login" class="nero.LoginAction"> <!-- 定义结果页面 --> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> </package> </struts>
可见,在配置文件中,首先是配置了国际化资源文件名的基本字符,加载的时候会自动匹配对应的国际化资源文件。然后我们定义了一个name属性为“login”的action,class对应“包名称.类名称”。最后定义了结果界面,对应的“error”和“success”为响应类中excute()方法的两个返回值。
最后给出两个结果界面的编码:
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title><s:text name="succPage"/></title> </head> <body> <s:text name="succTip"> <s:param>${sessionScope.user}</s:param> </s:text><br> </body> </html>
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title><s:text name="errorPage"/></title> </head> <body> <s:text name="failTip"/> </body> </html>
测试和回顾:
最后进行简单的测试和总结。
测试:
再来看看Eclipse是怎么组织这个项目的文件结构的:
项目名NeroStrutsTest下的文件结构:
WebContent文件夹内结构如下:
Src文件夹内结构如下:
Build文件夹内结构如下:
可见,build目录下的内容实际上就是classes的内容,所以如果需要在服务器上部署该应用,只需要将classes文件夹复制到WEB-INF文件夹内即可。
总结:
Struts开发基本步骤:
最后让我们回顾一下struts的基本开发步骤:
1、 在WEB-INF/web.xml文件中配置struts过滤器来拦截用户请求;
2、 如果有表单需发出post请求,则先设计一个发送请求的jsp页面;
3、 定义处理用户请求的Action类,在上面的例子中我们继承了ActionSupport类,这就是MVC结构中的Controller,当然我们也可以用一个jsp页面去响应请求,不过实际上最后还是要归结到控制器上来,为了方便学习,我们这里直接由控制器去做出响应。
4、 在WEB-INF/classes/struts.xml文件中配置Action类,并进而配置<result ></result>处理结果
其他:编写和生成国际化资源文件。
补充内容:
如果一个struts.xml配置文件编码过长的话,非常不利于维护和管理,这个时候我们可以把它分拆成几个小的xml文件进行管理,然后在struts.xml文件中我们只需要通过include元素将这些文件添加进来即可:
结语:
这篇笔记只是简单介绍struts框架怎么使用,但是在实际应用的时候,通过是要SSH三个框架结合使用的,后面再写相关笔记。