struts作为非常成功的经典开源MVC模式,它是如下运作的:
* Controller(控制器)由ActionServlet和Action类来实现。
* ActionServlet负责读取struts-config.xml配置文件,使用
ActionMapping来查找对应的Action,并把请求转发给Action类。
* 对于大型应用,Action类充当用户请求和业务逻辑处理之间的Adaptot(适配器)。
* 在Model(模型)端,业务逻辑可以采用Java Bean或者EJB来完成。
* ActionForm Bean负责传递系统状态
* 视图端主要是JSP,struts通过其内部的标签库进行了扩展。
下面我们来举个简单的helloapp的例子。
场景: 页面端有个文本,根据用户输入的名字,返回Hello 输入名。
如果用户输入空,则提示不能为空;如果用户输入的是monstor,
则提示非法。
我们需要建立一个jsp文件,在上面放上提示,文本框,按钮还有错误提示。
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html locale="true">
<head>
<title><bean:message key="hello.jsp.title" /></title>
<html:base/>
</head>
<body bgcolor="white"><p>
<h2><bean:message key="hello.jsp.page.heading"/></h2><p>
<html:errors/><p>
<logic:present name="personbean" scope="request">
<h2>
<bean:message key="hello.jsp.page.hello"/>
<bean:write name="personbean" property="userName" />
</h2>
</logic:present>
<html:form action="/HelloWorld.do" focus="userName" >
<bean:message key="hello.jsp.prompt.person"/>
<html:text property="userName" size="16" maxlength="16"/><br>
<html:submit property="submit" value="Submit"/>
<html:reset/>
</html:form><br>
<html:img page="/struts-power.gif" alt="Powered by Struts"/>
</body>
</html:html>
在上面的代码中,我们使用了许多struts自己的标签。
我们来分析下:
<html:form> | | 创建HTML表单,能够将表单字段和ActionForm Bean的属性关联起来。 |
<bean:message> | | 输出本地化文本,key属性对应文本。 |
<html:text> | | 创建文本框。 |
<bean:write> | | 输出JavaBean的属性值,property对应属性。 |
<html:errors> | | 显示错误信息。 |
<logic:present> | | 判断JavaBean在特定的范围那是否存在,存在才会去执行主体内容。 |
<html:submit> | | 提交按钮。 |
<html:reset> | | 清空按钮。 |
由于我们使用了许多消息文本,我们需要将这些文本本地化,因此
我们需要创建资源文件。
applicatoin.properties:
#Application Resources for the "Hello" sample application
#Application Resources that are specific to the hello.jsp file
hello.jsp.title=Hello - A first Struts program
hello.jsp.page.heading=Hello World! A first Struts application
hello.jsp.prompt.person=Please enter a UserName to say hello to :
hello.jsp.page.hello=Hello
#Validation and error messages for HelloForm.java and HelloAction.java
hello.dont.talk.to.monster=We don't want to say hello to Monster!!!
hello.no.username.error=Please enter a <i>UserName</i> to say hello to!
接下来,我们需要创建ActionForm Bean。
HelloForm.java:
package mytrain.struts.helloapp;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class HelloForm extends ActionForm {
private String userName = null;
public String getUserName() {
return (this.userName);
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 重置属性
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.userName = null;
}
/**
* 验证属性非空,返回ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if ((userName == null) || (userName.length() < 1))
errors.add("username", new ActionMessage("hello.no.username.error"));
return errors;
}
}
注:ActionErrors类是ActionMessage的子类。
从struts1.2开始废弃ActionErrors,统一使用ActionMessage来表示正常或
错误消息。
接下来,我们需要创建常量类和业务类。
Constants.java:
package mytrain.struts.helloapp;
public final class Constants {
public static final String PERSON_KEY = "personbean";
}
PersonBean.java:
package mytrain.struts.helloapp;
public class PersonBean {
private String userName = null;
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
接着,我们便可以创建重点类 - Action类了。
HelloAction.java:
package mytrain.struts.helloapp;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
public class HelloAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// These "messages" come from the ApplicationResources.properties file
MessageResources messages = getResources(request);
/*
* 基本验证在ActionForm Bean中做,
* 业务逻辑验证在Action中做.
*/
ActionMessages errors = new ActionMessages();
String userName = (String)((HelloForm) form).getUserName();
String badUserName = "Monster";
if (userName.equalsIgnoreCase(badUserName)) {
errors.add("username", new ActionMessage("hello.dont.talk.to.monster", badUserName ));
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}
/*
* Having received and validated the data submitted
* from the View, we now update the model
*/
PersonBean pb = new PersonBean();
pb.setUserName(userName);
pb.saveToPersistentStore();
/*
* 将数据 - JavaBean通过page, request, session, servlet context这些范围
* 传递到视图组件.
*/
request.setAttribute( Constants.PERSON_KEY, pb);
// Remove the Form Bean - don't need to carry values forward
request.removeAttribute(mapping.getAttribute());
// Forward control to the specified success URI
return (mapping.findForward("SayHello"));
}
}
最后,我们需要在我们的核心配置文件struts-config.xml中配置Action映射,
全局转向(forward),FormBean定义,资源文件定义。
struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<!-- Form Bean Definitions -->
<form-beans>
<form-bean name="HelloForm" type="mytrain.struts.helloapp.HelloForm"/>
</form-beans>
<global-exceptions />
<global-forwards />
<!-- Action Mapping Definitions -->
<action-mappings>
<action path = "/HelloWorld"
type = "mytrain.struts.helloapp.HelloAction"
name = "HelloForm"
scope = "request"
validate = "true"
input = "/hello.jsp"
>
<forward name="SayHello" path="/hello.jsp" />
</action>
</action-mappings>
<!-- Message Resources Definitions -->
<message-resources parameter="mytrain.struts.helloapp.application"/>
</struts-config>
分享到:
相关推荐
在着手开发任何应用程序之前,首要步骤是对项目需求进行深入分析。对于helloapp应用而言,其核心需求可归纳为以下几点: 1. **接收用户输入的姓名**:用户通过界面输入姓名,系统需正确接收并处理这一信息。 2. **...
"学习Struts的第一个试验helloapp"是一个非常适合初学者入门的实践项目,通过这个项目,你可以了解并掌握Struts的基本概念和工作流程。 首先,让我们来看看Struts框架的核心组成部分: 1. **Model**:模型层是业务...
Struts是Apache软件基金会下的一个开源项目,是一个用于构建Java Web应用程序的MVC(Model-View-Controller)框架。孙卫琴老师的“精通Struts”教程深入浅出地讲解了如何使用Struts来构建高效、可维护的Web应用。在...
在这个压缩包中,包含的是书中第二章的一个实例——"helloapp_version1"。这个例子是学习Struts基础功能的起点,它通过创建一个简单的"Hello, World!"应用程序来引导读者进入Struts的世界。 首先,Struts是一个开源...
《精通Struts:基于MVC的Java Web设计与开发》是孙卫琴撰写的一本经典教程,这本书深入探讨了如何使用Struts框架构建高效的Java Web应用程序。Struts是一个开源的MVC(Model-View-Controller)框架,它帮助开发者...
- **2.3.1 情景 1:不带应用程序服务器的 Web 服务器**:只能处理静态内容。 - **2.3.2 情景 2:带应用程序服务器的 Web 服务器**:能处理静态和动态内容。 **2.4 应用程序服务器示例** - **2.4.1 BEA Weblogic**:...
**2.3.1 情景1:不带应用程序服务器的Web服务器** 在这种情况下,Web服务器只能处理静态内容,无法处理动态内容。 **2.3.2 情景2:带应用程序服务器的Web服务器** 这种组合能够处理动态内容,例如通过Servlets和...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...