按照教程搭建项目的时候被坑了一下,主要问题是在Struts下载的环境搭建所需的最基本的包并不足以让项目跑起来,这让我很疑惑。
将下载下来的Struts2框架的jar包复制到web应用的WEB-INF/lib路径下(注意不能下载最小依赖包,因为它比下面少了很多搭建项目必须的包)。
任何MVC框架需要与Web应用整合时都需要借助web.xml配置文件。
为Web应用配置Strut2核心控制器:
<?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>chapter02</display-name>
<!-- 配置Struts 2框架的核心Filter -->
<filter>
<!--过滤器名 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts 2的核心Filter的实现类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 让Struts 2的核心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.jsp</welcome-file>
</welcome-file-list>
</web-app>
因为StrutsPrepareAndExecuteFilter是一个过滤器,所以在web.xml配置文件中使用<filter>和<filter-mapping>元素来配置StrutsPrepareAndExecuteFilter。
struts.xml文件中定义了Struts 2框架用到的一系列Action。在配置一个Action时,必须指定该Action的实现类,并定义该Action的处理结果与视图资源之间的映射关系。
<?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>
<!-- 指定Struts2处于开发阶段,可以进行调试 -->
<constant name="struts.devMode" value="true" />
<!-- Struts2的Action都必须配置在package里,此处使用默认package -->
<package name="default" namespace="/" extends="struts-default">
<!-- 定义一个名为XXX的Action,实现类为com.XXX.XXX.action.XXX -->
<action name="XXX" class="com.XXX.XXX.action.XXX">
<!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
<result name="success">/result.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
在上述配置文件中,配置了一个Action并指定该Action所对应的实现类,再定义多个<result>元素,指明返回值和视图资源之间的映射关系。其中result的name属性是业务处理方法的返回的字符串值;而<result>元素的起始标签和结束标签之间的内容是要转向的资源,此处转向的资源可以是JSP页面、FreeMarker或者另一个Action。
创建一个输入页面 ,用于接收用户输入的数据:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">--%>
<html>
<head>
<title>用户信息采集</title>
</head>
<body>
<form method="post" action="user.action">
用户名:<input type="text" name="userName" /><br/>
地址:<input type="text" name="address" /><br/>
电话:<input type="text" name="telephone" /><br/>
邮箱:<input type="text" name="email" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
创建业务控制器UserAction类:
package com.qst.chapter02.action;
public class UserAction {
// 用户名
private String userName;
// 地址
private String address;
// 电话
private String telephone;
// 邮箱
private String email;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String execute() throws Exception {
if (userName.length() > 0 && address.equals("青岛")) {
return "success";
} else {
return "error";
}
}
}
上述代码中UserAction是一个POJO,定义了四个属性,这4个属性名必须跟input.jsp页面中的输入文本框的name属性值对应;然后对这4个属性提供相应的getter/setter方法。这样当用户提交页面中的表单时,表单中输入的数据会通过setter方法设置到对应的属性中。业务处理方法execute()会判断数据是否符合要求,并返回“success”或“error”字符串。
配置业务控制器:
<?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>
<!-- 指定Struts2处于开发阶段,可以进行调试 -->
<constant name="struts.devMode" value="true" />
<!-- Struts2的Action都必须配置在package里,此处使用默认package -->
<package name="default" namespace="/" extends="struts-default">
<!-- 定义一个名为user的Action,实现类为com.qst.chapter02.action.UserAction -->
<action name="user" class="com.qst.chapter02.action.UserAction">
<!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
<result name="success">/result.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
配置了一个名为user的Action,并指明该Action所对应的实现类。在<result>元素中指明execute()方法的返回值与视图页面资源之间的映射关系。
创建结果视图result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>显示用户信息</title>
</head>
<body>
用户名:${param.userName} <br/>
地址:${param.address} <br/>
电话:${param.telephone} <br/>
邮箱:${param.email} <br/>
</body>
</html>
上面的页面使用EL表达式显示用户信息。
再编写一个错误页面error.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>错误页面</title>
</head>
<body>
您输入的信息不符合要求,请重新输入!
</body>
</html>
启动Tomcat服务器,运行chapter02项目。
输入用户数据单击“提交”按钮,成功后显示结果信息页面。
错误页面: