Studs MVC Framework-----PHP的Struts1.X实现
Jakarta Struts结构移植过来的PHP开发框架,使用面向对象的开发结构和API,模拟了一个HTTP Servlet容器和使用了PHP服务页面引擎技术。
下载地址:http://mojavelinux.com/projects/studs/
文件结构如下:
如上图,WEB-INF中的文件都是Studs框架的核心文件(尤其是lib和tld下的文件),其中:
1.messages.properties文件:
welcome.title=Studs :: Welcome
welcome.heading=Welcome to Studs!
welcome.message=The application has been successfully installed!
pageviews.message=This page has been viewed <strong>{0}</strong> times.
2.struts-config.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<!--
This is a basic Studs/Struts configuration file with an example
welcome action/page and other commented sample elements.
-->
<struts-config>
<!-- example configuration of a database connection
<data-sources>
<data-source type="horizon.sql.BasicDataSource">
<set-property
property="description"
value="Primary data source for localhost database"/>
<set-property
property="driverClassName"
value="horizon.sql.drivers.MySQLDriver"/>
<set-property
property="username"
value="user"/>
<set-property
property="password"
value="secret"/>
<set-property
property="url"
value="mysql://localhost/dbname"/>
</data-source>
</data-sources>
-->
<form-beans>
<!-- sample form bean descriptor for an ActionForm
<form-bean
name="inputForm"
type="app.InputForm"/>
-->
</form-beans>
<global-exceptions>
<!-- sample exception handler
<exception
key="expired.password"
type="app.ExpiredPasswordException"
path="/changePassword.jsp"/>
-->
</global-exceptions>
<global-forwards>
<!-- Default forward to "welcome" action -->
<forward name="welcome" path="/welcome.do"/>
</global-forwards>
<action-mappings>
<!-- Default "welcome" action -->
<action path="/welcome" forward="/pages/welcome.psp"/>
<action path="/example" forward="/pages/example.psp"/>
<!-- sample input and input submit actions
<action
path="/Input"
type="org.apache.struts.actions.ForwardAction"
parameter="/pages/Input.jsp"/>
<action
path="/InputSubmit"
type="app.InputAction"
name="inputForm"
scope="request"
validate="true"
input="/pages/Input.jsp"/>
<action
path="/edit*"
type="app.Edit{1}Action"
name="inputForm"
scope="request"
validate="true"
input="/pages/Edit{1}.jsp"/>
-->
</action-mappings>
<controller locale="false" inputForward="true"/>
<message-resources parameter="/WEB-INF/messages.properties"/>
</struts-config>
3.web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Studs Basic Application</display-name>
<description>A bare-bones foundation for creating a web application based on the Studs MVC Framework+</description>
<context-param>
<!-- if controlAllResources is set, all files should be handled by the stratus
container, including all non-php/html files -->
<param-name>controlAllResources</param-name>
<param-value>false</param-value>
</context-param>
<!-- Servlet Definitions -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>stratus.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>phase</servlet-name>
<servlet-class>phase.servlet.PhaseServlet</servlet-class>
<init-param>
<param-name>scratchdir</param-name>
<param-value>/WEB-INF/work</param-value>
</init-param>
<init-param>
<param-name>tldresourcedir</param-name>
<param-value>/WEB-INF/tld</param-value>
</init-param>
<init-param>
<param-name>ignoreEL</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>studs.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>validating</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- Servlet Mappings -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>phase</servlet-name>
<url-pattern>*.psp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- Mime Type Mappings -->
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>css</extension>
<mime-type>text/css</mime-type>
</mime-mapping>
<mime-mapping>
<extension>js</extension>
<mime-type>text/javascript</mime-type>
</mime-mapping>
<mime-mapping>
<extension>png</extension>
<mime-type>image/png</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpeg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>gif</extension>
<mime-type>image/gif</mime-type>
</mime-mapping>
<!-- Default Welcome File List -->
<welcome-file-list>
<welcome-file>index.psp</welcome-file>
</welcome-file-list>
</web-app>
4.文件build.xml:
<?xml version="1.0"?>
<project name="Studs Basic" basedir="../.." default="package">
<property file="../../build.properties" />
<target name="package" depends="prepare">
<mkdir dir="../../${release.dir}/${project.release.version}"/>
<tar destfile="../../${release.dir}/${project.release.version}/studs-basic-${project.release.version}.tar.gz" compression="gzip">
<tarfileset dir="." prefix="studs-basic" defaultexcludes="yes">
<exclude name="classes/build.xml"/>
<exclude name="**/TODO"/>
<exclude name="**/NOTES"/>
</tarfileset>
</tar>
</target>
<target name="clean">
<!-- make sure to break symlinks -->
<symlink action="delete" link="${basedir}/WEB-INF/lib" failonerror="no"/>
<symlink action="delete" link="${basedir}/WEB-INF/tld" failonerror="no"/>
<delete includeemptydirs="yes" failonerror="no">
<fileset dir="WEB-INF/work">
<include name="**"/>
</fileset>
<fileset dir="WEB-INF/lib">
<include name="**"/>
</fileset>
<fileset dir="WEB-INF/tld">
<include name="**"/>
</fileset>
</delete>
</target>
<target name="prepare" depends="clean">
<!-- create work directory -->
<mkdir dir="WEB-INF/work"/>
<chmod dir="WEB-INF/work" perm="0777" type="dir"/>
<!-- create lib directory and copy framework libraries -->
<mkdir dir="WEB-INF/lib"/>
<copy todir="WEB-INF/lib">
<fileset dir="../../src">
<include name="**"/>
</fileset>
</copy>
<!-- create tld directory and copy known tlds -->
<mkdir dir="WEB-INF/tld"/>
<copy todir="WEB-INF/tld">
<fileset dir="../../conf/tld">
<include name="*.tld"/>
</fileset>
</copy>
<!-- copy over the controller and server conf file -->
<copy todir=".">
<fileset dir="../../conf">
<include name="index.php"/>
<include name=".htaccess"/>
</fileset>
</copy>
</target>
</project>
5.logging.properties文件:
# == Setup log appenders ==
#logging.rootLogger=DEBUG, file
#logging.appender.file=horizon.util.logging.FileLogAppender
#logging.appender.file.file=/tmp/studs-basic.log
# == Specific logging per category ==
#logging.logger.[partial package or classname]=DEBUG
其他文件基本上都可以在框架源代码中找到。
页面文件如下:
1.index.php:
<?php
error_reporting(E_ALL);
ini_set(''include_path'', ''WEB-INF/lib'' . (DIRECTORY_SEPARATOR == ''/'' ? '':'' : '';'') . ''WEB-INF/classes'');
umask(0002);
require_once ''horizon/init.php'';
import(''stratus.connector.HttpProcessor'');
import(''stratus.config.ContextConfig'');
$config = & new ContextConfig(dirname(__FILE__));
$processor = & new HttpProcessor($config->getContext());
$processor->run();
?>
2.index.psp:
<%...@ page language="php" %>
<%...@ taglib uri="/WEB-INF/tld/phase-core.tld" prefix="c" %>
<%...@ taglib uri="/WEB-INF/tld/studs-html.tld" prefix="html" %>
<c:redirect context="/"><html:rewrite forward="welcome"/></c:redirect>
3.welcome.psp:
<%...@ page language="php" %>
<%...@ taglib uri="/WEB-INF/tld/phase-core.tld" prefix="c" %>
<%...@ taglib uri="/WEB-INF/tld/phase-fmt.tld" prefix="fmt" %>
<%...@ taglib uri="/WEB-INF/tld/studs-html.tld" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><fmt:message key="welcome.title" /></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h3><fmt:message key="welcome.heading" /></h3>
<p><fmt:message key="welcome.message" /></p>
<p><html:link action="/example">Click here</html:link> for an example of the template tag library.</p>
<c:set var="welcomePageViewCount" value="${applicationScope.welcomePageViewCount + 1}" scope="application"/>
<p style="font-size: small;"><fmt:message key="pageviews.message" arg0="${applicationScope.welcomePageViewCount}"/></p>
</body>
</html>
4.example.psp:
<%...@ taglib uri="/WEB-INF/tld/studs-template.tld" prefix="template" %>
<%...@ taglib uri="/WEB-INF/tld/phase-string.tld" prefix="str" %>
<%...@ taglib uri="/WEB-INF/tld/phase-core.tld" prefix="c" %>
<template:insert template="/pages/tmpl/template.psp">
<template:put name="title" content="Studs :: Template Taglib Example" direct="true"/>
<template:put name="heading" direct="true">Template Taglib Example</template:put>
<template:put name="intro" direct="true">
This page demonstrates the use of the studs template taglib. Content is inserted by the parent page either directly or via an include file. Below are two examples of content insertion.
</template:put>
<template:put name="content" direct="true">
<str:replace replace="LF" with="<br />">This text was specified inline using the template:put tag.
It also uses the str:replace taglib to convert endlines to BR tags.
I am also testing the conditional EL syntax. <strong>${2 % 2 ? ''odd'' : ''even''}</strong></str:replace>
</template:put>
<template:put name="content2" content="/pages/tmpl/content.psp" />
</template:insert>
5.template.psp:
<%...@ taglib uri="/WEB-INF/tld/studs-html.tld" prefix="html" %>
<%...@ taglib uri="/WEB-INF/tld/studs-template.tld" prefix="template" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><template:get name="title" /></title>
</head>
<body>
<h3><template:get name="heading" /></h3>
<p><template:get name="intro" /></p>
<p style="border: 1px dashed #999999; background-color: #F0F0F0;">
<template:get name="content" />
</p>
<p style="border: 1px dashed #999999; background-color: #F0F0F0;">
<template:get name="content2" />
</p>
<p>« <html:link forward="welcome">Back</html:link></p>
</body>
</html>
6.content.psp:
This text comes from an include file using the template:put tag.
这样,一个基于PHP Studs框架的示例程序就完成了。(注:上诉代码取自studs自带的例子)
补充:Php教程,Php常用代码