struts简介
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用JavaServlet/JSP技术,实现了基于JavaEE Web应用的MVC架构模式的应用框架,是MVC经典架构模式中的一个经典产品。
struts下载
关于JDK和eclipse的安装不再敖述,访问Apache Struts官网:http://struts.apache.org/download.cgi,选择下载Struts 2.5.X版本。这里有如下下载选项:
建议选择Full Distribution
选项,它包含struts2的核心库、源代码、文档和实例等。
下载完成后,将压缩包解压到任意目录下,打开struts-2.5.X文件,它有一个lib
子目录,里面的文件就是我们进行Web应用开发所需的struts2核心jar包和struts插件jar包。
如果不清楚哪些jar包是struts的核心jar包的话,可以在下载struts2时选择Essential Dependencies Only
选项,它就是struts2的核心jar包的压缩包。
struts-2.5.8的核心jar包有如下几个:
使用struts
在eclipse里创建一个动态Web项目,将struts2的核心jar包(如果需要其它struts2插件的支持,可以另外导入插件的jar包)拷贝到Web项目的WebContent\WEB-INF\lib
目录下,此时的项目结构如下:
现在就可以在eclipse中使用struts2的API了。
第一个基于struts2的Web应用
下面编写一个基于struts2的Web应用。
在web.xml里配置Filter
第一步,需要在web.xml文件里配置struts2的Filter,如下所示:
<!-- web.xml -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
StrutsPrepareAndExecuteFilter的配置和普通的Filter一样,只是<filter-class>
需要使用struts2的Filter类。
这里需要注意,由于struts2的版本更新,有些包名有所改变,StrutsPrepareAndExecuteFilter所在的包也发生了变化,如下图:
详细情况可以在Apache Struts的官网上找到:http://struts.apache.org/docs/version-notes-25.html
在eclipse中创建stru.xml配置文件
eclipse里默认是不会自动生成struts.xml文件的,这个文件主要是用来配置struts的,包括常量配置、action配置等,它非常重要。
在eclipse中,想要创建struts.xml,只能先创建一个XML格式的文件,然后在里面配置struts,这样非常不方便而且容易出错,下面提供了一个更好的方法:
1. 点击菜单栏的Window
选项,依次选择Preferences
、XML
、XMLCatalog
,在弹出的窗口中点击右侧的Add
;
2. 在Location
处填写%STRUTS_HOME%/src/core/src/main/resources/struts-2.X.dtd
,在Key type
处选择Public ID
,在Key
处填写-//Apache Software Foundation//DTD Struts Configuration 2.X//EN
,在Alternative web address
处填写http://struts.apache.org/dtds/struts-2.X.dtd,
,点击OK
,如下图:
3. 点击OK
完成DTD的添加,下面就可以在eclipse中创建struts.xml文件了;
4. 右击项目(或项目的子目录,一般将struts.xml文件放在src目录下),选择New
-Other
-XML
-XML File
,输入文件名(我们输入struts.xml),Next
,选择Creat XML file from a DTD file
,Next
,选择Select XML Catalog entry
,在出现的XML文本选择下拉框中选择-//Apache Software Foundation//DTD Struts Configuration 2.X//EN
,Next
,Finish
,如下图:
5. struts.xml文件就新建好了,现在的项目结构如下:
编写jsp页面和国际化资源文件
下面编写一个简单的登录程序,它包含三个页面:登录页面、欢迎页面和错误页面。
首先,先在.properties文件中定义Label使用的资源(后期修改Label时只需要修改资源文件):
# mess.properties
loginPage=登录页面
errorPage=错误页面
succPage=成功页面
failTip=对不起,您不能登录!
succTip=欢迎,{0},您已经登录!
user=用户名
pass=密 码
login=登录
由于此文件中包含中文字符,要让Web应用可以使用这份资源文件,首先需要使用native2ascii工具对其进行转码,有关native2ascii工具的内容可以参考这篇文章:《native2ascii Java的一个文件转码工具(properties文件汉字转换)》。
转码完成后,得到mess_zh_CN.properties
文件,同样还可以提供一份mess_en_US.properties
文件(此文件不需要使用native2ascii工具进行转码),此时的项目结构如下所示:
注意这里将资源文件放在src目录下是因为eclipse会自动把src目录下的非.java文件拷贝到classes目录中。
然后编写登录页面:
<!-- login.jsp -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<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>
这里使用了struts2的自定义标签库,它提供了许多标签供我们使用。其他两个页面和登录页面类似,这里不再给出。
在运行Web应用之前,还需要在struts.xml文件中添加如下内容:
<!-- struts.xml -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<constant name="struts.i18n.encoding" value="GBK"/>
struts.custom.i18n.resources
属性指定了全局国际化资源文件,struts.i18n.encoding
属性指定了国际化编码所使用的字符集,设定此属性相当于执行HttpServletRequest.setCharacterEncoding
方法。
运行Web应用,在浏览器地址栏输入http://localhost:8080/StrutsDemo/first/login.jsp
,可以看到登录页面(login.jsp在first目录下):
可以看到,登录页面中的Label成功显示了资源文件中定义的字符串。
使用action作为控制器
上面的jsp页面仅仅作为“视图”呈现给用户,为了与用户进行交互,还需要添加action作为控制器。
定义LoginAction类,它继承自com.opensymphony.xwork2.ActionSupport
类:
// LoginAction.java
public class LoginAction extends ActionSupport {
private String username;
private String password;
private static final long serialVersionUID = 1L;
public String getUsername() { return username; }
public String getPassword() { return password; }
public void setUsername(String u) { username=u; }
public void setPassword(String p) { password=p; }
@Override
public String execute() throws Exception {
super.execute();
if(getUsername().equals("张三") && getPassword().equals("123456")) {
ActionContext.getContext().getSession().put("user", getUsername());
return SUCCESS;
}
else
return ERROR;
}
}
在struts.xml文件中配置此action:
<!-- struts.xml -->
<package name="zzw" extends="struts-default">
<action name="login" class="com.zzw.action.LoginAction">
<result name="input">/first/login.jsp</result>
<result name="success">/first/welcome.jsp</result>
<result name="error">/first/error.jsp</result>
</action>
</package>
现在就可以使用这个及其简单的Web应用了。
最终的项目结构如下: