posted @
2007-08-14 10:07 jadmin 阅读(75) |
评论 (0) |
编辑 收藏
Struts 框架带有几个自定义标签库(有关 Struts 的更多信息的链接请参阅 参考资料 )。这些库中的一个标签可以创建一个支持改写 URL 的链接并用 jsessionid
对改写的连接编码。
不过有一个问题:如果希望传递一组请求参数(如查询字符串),也许必须为此创建一个 Java scriptlet。真是乱!下面的清单 (search_results.jap) 展示了一个 JSP 页,它被迫加入了这样一个 scriptlet。
<%@ taglib uri="struts-html" prefix="html" %> <jsp:useBean class="java.util.HashMap" id="deleteParams" /> <% deleteParams.put("id", cd.getId()); deleteParams.put("method","delete"); %> <!-- Pass the map named deleteParams to html:link to generate the request parameters--> <html:link action="/deleteCD" name="deleteParams">delete </html:link> </font></td>
search_results.jsp 创建一个 hashmap 并向这个 map 传递两个属性。在下面几小节,我们将创建一个不用 Java 代码完成这项工作的自定义标签。我们的标签将定义如下的一个 hashmap:
<map:mapDefine id="deleteParams"> <map:mapEntry id="id" name="cd" property="id"/> <map:mapEntry id="method" value="delete"/> </map:mapDefine> <!-- Pass the map named deleteParams to html:link to generate the request parameters--> <html:link action="/deleteCD" name="deleteParams">delete </html:link> </font></td>
这将使我们可以容易地创建小型 map。
这个例子将展示几个关键概念,包括使用嵌套标签和定义 scriplet 变量。首先我将解释这个标签是如何工作的。然后在以后的几节中建立这些概念,并介绍如何编写这个标签的不同形式,使它们处理其正文并控制执行流程。
posted @
2007-08-14 10:07 jadmin 阅读(69) |
评论 (0) |
编辑 收藏
posted @
2007-08-14 10:06 jadmin 阅读(79) |
评论 (0) |
编辑 收藏
一、基本概念:
*************************************************************************************
1.标签(Tag):
标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的
2.标签库(Tag library):
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
3.标签库描述文件(Tag Library Descriptor):
标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
4.标签处理类(Tag Handle Class):
标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能
*************************************************************************************
二、自定义JSP标签的格式:
*************************************************************************************
1.<% @ taglib prefix=”someprefix” uri=”/sometaglib” %>
为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:
1.从一个指定的标签库中识别出代表这种自定义行为的标签
2.找到实现这些自定义行为的具体类
第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive's Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。
uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称
2.<someprefix:sometag key=”somevalue”/>
当web应用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也就是说它们会定位所有的TLD文件。对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。
在JSP页面中,我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配
*************************************************************************************
三、自定义JSP标签的处理过程:
*************************************************************************************
1.在JSP中引入标签库:<% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>
2.在JSP中使用标签库标签:<prefix : tagname attribute=”tagattribute”>
3.Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
4.Web容器根据uri属性在web.xml找到对应的<taglib>元素
5.从<taglib>元素中获得对应的<taglib-location>元素的值
6.Web容器根据<taglib-location>元素的值从WEB-INF/目录下找到对应的.tld文件
7.从.tld文件中找到与tagname对应的<tag>元素
8.凑<tag>元素中获得对应的<tag-class>元素的值
9.Web容器根据<tag-class>元素的值创建相应的tag handle class的实例
10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理
*************************************************************************************
四、创建和使用一个Tag Library的基本步骤:
*************************************************************************************
1.创建标签的处理类(Tag Handler Class)
2.创建标签库描述文件(Tag Library Descrptor File)
3.在web.xml文件中配置<tag>元素
4.在JSP文件中引人标签库
*************************************************************************************
五、TagSupport类简介:
*************************************************************************************
1.处理标签的类必须扩展javax.servlet.jsp.TagSupport.
2.TagSupport类的主要属性:
A.parent属性:代表嵌套了当前标签的上层标签的处理类
B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象
3.JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量
4.在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用
setPageContext方法对pageContext进行初始化
*************************************************************************************
六、TagSupport处理标签的方法:
*************************************************************************************
1.TagSupport类提供了两个处理标签的方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
2.doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。
A.Tag.SKIP_BODY:表示<prefix:someTag>…</prefix:someTag>之间的内容被忽略
B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行
3.doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag
()方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被
忽。略任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页
*************************************************************************************
七、用户自定义的标签属性:
*************************************************************************************
如果在标签中还包含了自定义的属性,例如:
<prefix:Mytag attribute1="value1">
...
</prefix:Mytag>
那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
*************************************************************************************
八、创建标签处理类的步骤:
*************************************************************************************
1.创建包含JSP网页静态文本的文件(即是要替换自定义JSP标签的文本)
2.在Web应用启动时装载静态文本
3.创建标签处理类
*************************************************************************************
九、如何创建包含JSP网页静态文本的文件:
*************************************************************************************
1.使用java.util.Properties类来存放要替换网页中自定义JSP标签的静态文本
2.Properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加
载。这些文本以key/value的形式存放在WEB-INF目录下,例如key=value,在属性列表中
这些key/value都是String类型的
*************************************************************************************
十、Properties类的常用API:
*************************************************************************************
1.setProperty(String key, String value):调用Hashtable类的put方法添加属性
2.getProperty(String key):获取属性列表中key对应的属性值
3.load(InputStream in):从输入流对象InputStream中读取属性列表(Properties list)
4.store(OutputStream out,String comment):使用适当的格式将属性列表的属性对写入输
出流对象中,默认使用ISO-88590-1编码格式,以行的方式处理输入。属性的key/value之
间以”=、:”配对,以回车、换行分隔key/value对
*************************************************************************************
十一、ServletContext类的常用API:
*************************************************************************************
1.getContext(String uripath):返回服务器中uripath所代表的ServletContext对象
2.getInitParameter(String name):返回ServletConfig对象中name参数的值
3.getMineType(String file):返回file参数代表的文件的MIME类型
4.getRequestDispatcher(String path):返回path代表的RequestDispacher对象
5.getResourceAsStream(String path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于Context Root
*************************************************************************************
十二、如何使用ServletContxt读取并保存属性文件:
*************************************************************************************
1.创建java.util.Properties类对象
2.获取ServletContext对象
3.将属性文件以输入流的形式读入到某个输入流对象中
4.将输入流对象加载到Properties对象中
5.将Properties对象保存到ServletContext对象中
*************************************************************************************
十三、如何在Web应用启动时装载静态文本:
*************************************************************************************
1.创建继承了HttpServlet类的子类,在web.xml中配置这Servlet时设置load-on-startup属性:
<servlet>
<servlet-name>someclass</servlet-name>
<servlet-class>somepackage.SomeClass</servlet-clas
<load-on-startup>1</load-on-startup>
</servlet>
2.在这个Servlet的init()方法中创建java.util.Properties类
3.获取当前Web应用的ServletContext对象
4.将WEB-INF目录下的属性文件读入到输入流InputStream中:
InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties");
5.将输入流加载到属性对象中
ps.load(in);
6.将属性对象保存到上下文中。
context.setAttribute("attributeName",ps);
*************************************************************************************
十四、如何创建标签处理类:
*************************************************************************************
1.引入必需的资源:
import javax.servlet.jsp.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;
2.继承TagSupport类并覆盖doStartTag()/doEndTag()方法
3.从ServletContext对象中获取java.util.Properties对象
4.从Properties对象中获取key对应的属性值
5.对获取的属性进行相应的处理并输出结果
*************************************************************************************
十五、创建标签库描述文件(Tag Library Descriptor):
*************************************************************************************
1.标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:
A.<taglib>:标签库元素
B.<tag>:标签元素
C.<attribute>:标签属性元素
2.标签库元素<taglib>用来设定标签库的相关信息,它的常用属性有:
A.shortname: 指定Tag Library默认的前缀名(prefix)
B.uri: 设定Tag Library的惟一访问表示符
3.标签元素<tag>用来定义一个标签,它的常见属性有:
A.name: 设定Tag的名字
B.tagclass: 设定Tag的处理类
C.bodycontent: 设定标签的主体(body)内容
1).empty:表示标签中没有body
2).JSP:表示标签的body中可以加入JSP程序代码
3).tagdependent:表示标签中的内容由标签自己去处理
4.标签属性元素<attribute>用来定义标签的属性,它的常见属性有:
A.name:属性名称
B.required:属性是否必需的,默认为false
C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于<%=…%>的表达式
*************************************************************************************
十六、在Web应用中使用标签:
*************************************************************************************
1.如果Web应用中用到了自定义JSP标签,则必须在web.xml文件中加入<taglib>元素,它用于声明所引用的标签所在的标签库
<taglib>
<taglib-uri>/sometaglib</taglib-uri>
<taglib-location>/WEB-INF/someTLD.tld</taglib-location>
</taglib>
2.<taglib-uri>:设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray
3.<taglib-location>:指定和Tag Library对应的TLD文件的位置
4.在JSP文件中需要加入<% @ taglib% >指令来声明对标签库的引用。例如:
<% @ taglib prefix = “somePrefix” uri = "/someuri" %>
5.prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符,它必须和web.xml中的<taglib-uri>属性保持一致。
*************************************************************************************
posted @
2007-08-14 10:05 jadmin 阅读(68) |
评论 (0) |
编辑 收藏
posted @
2007-08-14 09:21 jadmin 阅读(67) |
评论 (0) |
编辑 收藏
JSP2.0中为了简化标签的复杂性,增加了制作Simple Tag的标签类SimpleTagSupport类。
SimpleTagSupport类是实现SimpleTag接口的。它只需要实现一个doTag()方法即可,而不需要一堆回传值。
举例说明:
例1:HelloSimpleTag标签
第一步:制作标签处理类
HelloSimpleTag.java
package com.newould.taglib;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloSimpleTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Simple Tag");
}
}
第二步:编写标签性质文件
MyTaglib.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My Taglib by JavaWorld.com.tw</description>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Mytaglib</short-name>
<uri></uri>
......
<tag>
<description>Hello Simple Tag</description>
<name>HelloSimpleTag</name>
<tag-class>com.newould.taglib.HelloSimpleTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
第三步:编写Jsp网页
HelloSimpleTag.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>
<html>
<head>
<title>HelloSimpleTag.jsp</title>
</head>
<body>
<h2>Simple Tag 标签</h2>
<h1><mytag:HelloSimpleTag /></h1>
</body>
</html>
=================================================================
例2:AddSimpleTag标签
第一步:制作标签处理类
AddSimpleTag.java
package com.newould.taglib;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class AddSimpleTag extends SimpleTagSupport {
private int num1 = 0;
private int num2 = 0;
public void setNum1(int num1) {
this.num1 = num1;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public void doTag() throws JspException, IOException {
JspContext ctx = getJspContext();
JspWriter out = ctx.getOut();
int sum = num1 + num2;
ctx.setAttribute("sum", Integer.toString(sum));
out.println(num1 + " + " + num2 + " = " + sum);
}
}
第二步:编写标签性质文件
MyTaglib.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My Taglib by JavaWorld.com.tw</description>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Mytaglib</short-name>
<uri></uri>
......
<tag>
<description>Add Simple Tag</description>
<name>Add</name>
<tag-class>com.newould.taglib.AddSimpleTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>num1</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>num2</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
第三步:编写Jsp网页
AddSimpleTag.jsp
%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>
<html>
<head>
<title>AddSimpleTag.jsp</title>
</head>
<body>
<h2>AddSimpleTag 标签</h2>
<h1><mytag:Add num1="5" num2="9" /></h1>
最后结果:${sum}
</body>
</html>
=================================================================
例3 RepeatSimpleTag标签
RepeatSimpleTag标签 主要是用来重复显示某段文字。
这个例子在处理上与前两个例子有点不同
第一步:制作标签处理类
RepeatSimpleTag.java
package com.newould.taglib;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class RepeatSimpleTag extends SimpleTagSupport {
private int count = 0;//重复的次数
private JspFragment fragment;//重复的内容
public void setCount(int count) {
this.count = count;
}
public void setFragment(JspFragment fragment) {
this.fragment = fragment;
}
public void doTag() throws JspException, IOException {
JspContext ctx = getJspContext();
JspWriter out = ctx.getOut();
for(int i=0 ; i<count ; i++) {
fragment.invoke(null);//表示将fragment的内容显示出来
}
}
}
第二步:编写标签性质文件
MyTaglib.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My Taglib by JavaWorld.com.tw</description>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Mytaglib</short-name>
<uri></uri>
......
<tag>
<description>Repeate Simple Tag</description>
<name>Repeat</name>
<tag-class>com.newould.taglib.RepeatSimpleTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>fragment</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
注意:<fragment>true</fragment>,一定要这样设定fragment属性。
第三步:编写Jsp网页
RepeatSimpleTag.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>
<html>
<head>
<title>RepeatSimpleTag.jsp</title>
</head>
<body>
<h2>RepeatSimpleTag 标签</h2>
<mytag:Repeat count="5" >
<jsp:attribute name="fragment">
重复执行 ....<br>
</jsp:attribute>
</mytag:Repeat>
</body>
</html>
=================================================================
DynamicAttributes接口
只要制作的标签实现了DynamicAttributes接口就有动态属性的功能。
例如:我们要做多个数的累加运算,则AddSimpleTag标签就可以通过实现DynamicAttributes接口就可以实现了.
实现DynamicAttributes接口,必须实现setDynamicAttributes()方法,此方法用来接收动态属性.
举例:第一步:制作标签处理类
package com.newould.taglib;
import java.io.*;
import java.util.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class DynamicAdd extends SimpleTagSupport implements DynamicAttributes {
//用来接收动态属性
private ArrayList keys = new ArrayList();
private ArrayList values = new ArrayList();
public void doTag() throws JspException, IOException {
JspContext ctx = getJspContext();
JspWriter out = ctx.getOut();
float num = 0;
float sum = Float.parseFloat((String)values.get(0));
out.print(sum);
for (int i = 1 ; i < keys.size() ; i++) {
String temp = (String)values.get(i);
num = Float.parseFloat(temp);
sum = sum + num;
out.print(" + " + num);
}
out.print(" = " + sum);
ctx.setAttribute("sum", Float.toString(sum));
}
public void setDynamicAttribute(String uri, String name, Object value) throws JspException {
keys.add(name);
values.add(value);
}
}
第二步:编写标签性质文件
<tag>
<description>DynamicAttribute</description>
<name>DynAdd</name>
<tag-class>com.newould.taglib.DynamicAdd</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes>
</tag>
第三步:编写Jsp网页
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="JSPBook" tagdir="/WEB-INF/tags/" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>CH16 - DynAdd.jsp</title>
</head>
<body>
<h2>Tag File 范例</h2>
<JSPBook:DynAdd num1="111" num2="222" num3="444" >
<jsp:attribute name="great">
<font color="red">SUM:${sum} ...</red>
</jsp:attribute>
<jsp:attribute name="less">
<font color="blue">SUM:${sum} ...</red>
</jsp:attribute>
</JSPBook:DynAdd>
</body>
</html>
JSP2.0中为了简化标签的复杂性,增加了制作Simple Tag的标签类SimpleTagSupport类。
SimpleTagSupport类是实现SimpleTag接口的。它只需要实现一个doTag()方法即可,而不需要一堆回传值。
posted @
2007-08-14 09:19 jadmin 阅读(85) |
评论 (0) |
编辑 收藏
struts2.0简单的例子
今天在apache网站上无意中看到了struts项目2.0.1正式发布了,怀着欣喜的心情我下载了stuts2.0.1完整包。 Struts2.0.1是struts项目和WebWork2.2项目的合并版本,集成了两大流行MVC框架的优点,对struts框架来说是一个大的提升,同时也更大程度地简化了开发人员的开发过程。我简单地研究了一下这个新版本,现在给大家介绍一个入门级的小例子,希望能对学习这个新版本的朋友有点帮助。
这个例子完成了一次URL调用返回结果页面的过程。
首先,要从apache网站上下载struts2.0.1的完整包(可以从这里下载:http://struts.apache.org/downloads.html),解压后需要找到下列几个文件:
commons-logging-1.0.4.jar
freemarker-2.3.4.jar
ognl-2.6.7.jar
struts2-api-2.0.1.jar
struts2-core-2.0.1.jar
xwork-2.0-beta-1.jar
然后,我们就开始做第一个例子,我们就使用经典的“HelloWorld”的名字吧!
1. 制作目录结构
如下图所示:
stuts2是web应用的根目录。
2. 拷贝引用文件
将上面列举的jar文件拷贝到步骤1中制作的目录struts2\WEB-INF\lib中。
3. 制作jsp文件HelloWorld.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2><s:property value="message" /></h2>
</body>
</html>
将该文件拷贝到步骤1中制作的目录struts2\example中。
4.制作java文件HelloWorld.java
package example;


/** *//**
* <code>Set welcome message.</code>
*/
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport ...{

public static final String MESSAGE = "Struts is up and running ...";


public String execute() throws Exception ...{
setMessage(MESSAGE);
return SUCCESS;
}

private String message;


public void setMessage(String message)...{
this.message = message;
}


public String getMessage() ...{
return message;
}
}
使用下面的命令编译这个java文件:
set CLASSPATH=yourdirectory\xwork-2.0-beta-1.jar
javac HelloWorld.java
将编译后的HelloWorld.class文件拷贝到步骤1中制作的目录struts2\WEB-INF\classes\example中。
5.制作web应用的描述文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<display-name>Struts Blank</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</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-list>
</web-app>
将该文件拷贝到步骤1中制作的目录struts2\WEB-INF中。
6.制作MANIFEST.MF文件(从其它地方随便找一个即可)
将该文件拷贝到步骤1中制作的目录struts2\META-INF中。
7.制作struts配置文件struts.xml和struts.properties
struts.xml文件:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="abc" namespace="/example" extends="struts-default">
<action name="HelloWorld" class="example.HelloWorld">
<result>/example/HelloWorld.jsp</result>
</action>
<!-- Add your actions here -->
</package>
</struts>
struts.properties文件:
struts.devMode = true
struts.enable.DynamicMethodInvocation = false
将这两个文件拷贝到步骤1中制作的目录struts2\ WEB-INF\classes中。
好了整个例子的文件我们都搞定了。
最后,你可以将制作好的web应用struts2拷贝到tomcat下运行。
访问http://localhost:8080/struts2/example/HelloWorld.action如果能够看到页面上的“Struts is up and running ...”提示信息说明你的例子是正确的。
Struts2与Struts1的对比
(转自:javaeye)
Action 类:
• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式:
• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet 依赖:
• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测性:
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:
• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
表达式语言:
• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).
绑定值到页面(view):
• Struts 1使用标准JSP机制把对象绑定到页面中来访问。
• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验:
• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
本文转自:http://blog.csdn.net/paulsen1980/archive/2007/05/18/1614643.aspx
posted @
2007-08-13 02:29 jadmin 阅读(60) |
评论 (0) |
编辑 收藏
1、web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="
http://java.sun.com/xml/ns/j2ee" xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>
struts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</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.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
其中,绿底色的部分是通用的部分。
2、struts.xml文件
这个文件的配置是最为重要的,也是比较容易出问题的地方,初学者对其中很多的参数不太明白,导致调试时候经常出错。下面先给出一个配置的代码:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"
http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"/>
<package name="package1" extends="struts-default">
<action name="Hello" class="tutorial.HelloWorld">
<result>HelloWorld.jsp</result>
</action>
<action name="HelloWorld" class="package1.HelloWorld">
<result>HelloWorld.jsp</result>
</action>
</package>
</struts>
1)对于<include file="struts-default.xml"/>这行代码,可以要也可以不要。
2)package的name是可以虚构的,并不一定要在classes目录下要有一个与这个name名对应的包名;像上面的配置文件中的name="package1"可以随便改成name="aaa"等是不影响结果的,只不过这个package名可以使得多个action聚合在一起,对大型的模块设计的时候是很有帮助的。
3)<action name="HelloWorld" class="package1.HelloWorld">中的HelloWorld这个name并不一定要与package1包中的类名相同,比如<action name="Hello" class="tutorial.HelloWorld">这样两个名字完全不一样是可以的,但是"Hello"这个name必须与输入的jsp页面里面的action内容是一致的,如<s:form action="Hello">
4)从上面的配置文件可以看出,在classes目录下面有两个包,一个是tutorial,一个是package1。
3、struts.properties文件
这个文件最简单,它与struts.xml文件一样,都是位于classes目录下面。其内容为:
struts.devMode = true
struts.enable.DynamicMethodInvocation = false的
4、建议初学者先看看为Struts 2.0做好准备这篇文章,这里每个步骤讲的非常的详细,但是有些细节作者没有写出来,让很多初学者调试的时候出很多错误,比如The requested resource (/项目名/HelloWorld) is not available.,java.lang.NullPointerException等等。
1)关于工具web tools platform,这是一个eclipse集成了很多web开发下所需工具的一个比较好的平台,它在eclipse的网站下面
http://www.eclipse.org/webtools/有下载。打开这个页面的右边download栏目下面有wtp的下载,点击这个去下载,如果不行,就再仔细找找了。
2)如果出现The requested resource (/项目名/HelloWorld) is not available.的话,就仔细找找看是不是输入的时候把配置文件等等地方写错了,对于初学者最容易把其中的字母搞错,比如struts是不写成了其它的形式,反正出现这个错误就是说访问的资源不存在,那就肯定要么是配置文件出错了,要么是你的类文件没有放在classes目录下面,无外这两种情况。错了不要紧,没有错误,哪会有进步呢。
3)如果你真的发现什么错误都没有,但就是尽管调试了半天还是调试不成功,那就考虑你的JDK版本是不是和你下载的wtp搭配了,建议把原来低版本的JDK卸载,装上新去下载的JDK,写这篇博客时,最新版本是jdk-1_5_0_10。如果还不行,你就把tomcat或者其它的web服务器换版本,总之要不怕错误和失败,要勤于不断的调试。
posted @
2007-08-13 01:41 jadmin 阅读(48) |
评论 (0) |
编辑 收藏
启动服务:
1通过控制面板里的服务选项
2通过命令行
net start mysql ->启动数据库
net stop mysql ->关闭数据库
连接数据库
mysql -u用户名 -p密码
查看服务器上当前存在什么数据库
show databases;
创建数据库
create database 数据库名;
如我要创建一个名为gbook的数据库
create database gbook;
删除数据库
drop database 数据库名;
如:
drop database gbook;
选择要使用的数据库
use 要使用的数据库名;
如:
use gbook;
查看当前使用的数据库中存在的表
show tables;
创建一个数据库表
create table person
{
id varchar(32) not null primary key,
name varchar(20) not null,
password varchar(20) not null
};
显示数据库中某个表的结构
describe 表名;
导入数据库创建脚本文件命令(如D:\mysql.sql)
先建立一个空数据库->选择它->导入脚本命令 如:
create database gbook;
source d:/mysql.sql;
删除表
drop table 表名;
删除数据库中某表的全部记录
delete from 表名;
如:
delete from gbook;
向表中插入数据(以前面的person表为例)
insert into 表名 values(对应的数据值);
如:
insert into person values('LXH','李兴华','moolee');
更新表中的数据
update person set password='zzzzz';
查看当前数据库服务器的版本
select version();
查看数据库服务器上的所有用户
select user();
查看当前日期时间
select now();
使用load命令向数据库的表中插入数据
load data local infile '路径' into table 表名;
如:
load data local infile 'f:/person.txt' into table person;
person.txt中则单纯的列出了许多表中的对应数据,如:
mldn 陈华 1569
god 黄雨 123456
admin 陈天赐 admin888
列出表中所有记录
select * from 表名;
如:
select * from person;
从表中只选择特定的行
select * from person where id='lxh';
select * from person where id='lxh' and name='李兴华';
选择表中特定的列(可以是多列哦,记得以,分开)
select name from person;
用distinct检索出每个唯一的输出记录
select distinct name from person;
计算总的记录数
select count(*) from person;
count()函数是查询数据库中的指定表有多少列
posted @
2007-08-12 23:21 jadmin 阅读(64) |
评论 (0) |
编辑 收藏
JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。
JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。
两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素 — scriptlet、表达式和声明。类似地,PermittedTaglibsTLV 验证器可以用来限制可能由应用程序的 JSP 页面访问的定制标记库集(包括 JSTL 标记库)。
尽管 JSTL 最终将会成为 J2EE 平台的必需组件,但目前只有少数应用程序服务器包括它。JSTL 1.0 的参考实现可作为 Apache 软件基金会(Apache Software Foundation)的 Jakarta Taglibs 项目(请参阅参考资料)的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器,以添加对 JSTL 的支持。
如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。这个zip文件可以从
http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下载。
JSTL的优点
1、 在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。
2、 简化了JSP和WEB应用程序的开发。
3、 以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。
4、 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。
posted @
2007-08-09 17:20 jadmin 阅读(42) |
评论 (0) |
编辑 收藏