Studs MVC Framework-----PHP的Struts1.X实现
2008-02-02 13:04
344 查看
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自带的例子)
下载地址: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自带的例子)
相关文章推荐
- Struts,MVC 的一种开放源码实现用这种servlet和JSP框架管理复杂的大型网站
- 用PHP开始你的MVC(三)实现你的Model层
- Struts,MVC 的一种开放源码实现用这种servlet和JSP框架管理复杂的大型网站
- MVC模式与如何实现struts MVC模式
- 简述MVC思想 与PHP如何实现MVC
- [转]Struts,MVC 的实现
- 使用NHibernate 3.2实现Repository(ORuM)(五)MVCQuick.Framework.Repository
- 简述MVC思想与PHP如何实现MVC
- 用PHP开始你的MVC (四)实现View层
- 深入浅析用PHP实现MVC
- 深入浅析用PHP实现MVC
- 详解PHP实现MVC的几种方法
- 用PHP开始你的MVC(三)实现你的Model层
- Golanger Web Framework(框架简单实现了MVC的设计方式)
- Struts,MVC 的一种开放源码实现用这种servlet和JSP框架管理复杂的大型网站
- Struts,MVC 的一种开放源码实现
- 简述MVC思想与PHP如何实现MVC
- Struts,MVC 的一种开放源码实现
- Struts,MVC 的一种开放源码实现
- PHP实现MVC开发得最简单的方法——单点入口