<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>落羽纷飞</title>
    <description></description>
    <link>http://yufei.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>要考驾照了,背理论知识............</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/134493" style="color:red;">http://yufei.javaeye.com/blog/134493</a>&nbsp;
          发表时间: 2007年10月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          考驾照了,背理论知识............<br />100道题要答对95道才算及格......<br />题库1600道....有得烦了...
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/134493#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Oct 2007 17:03:19 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/134493</link>
        <guid>http://yufei.javaeye.com/blog/134493</guid>
      </item>
      <item>
        <title>Java的AJAX请求中文编码方法</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/131962" style="color:red;">http://yufei.javaeye.com/blog/131962</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这里的方案是页面(page)是基于GBK(gb2312) 的编码格式<br /><br />AJAX的中文情况,默认情况下,tomcat和weblogic的get和post请求的编码方案都不一样,不过前提都是要设置request.setCharactorEncoding("UTF-8")如下面代码中,get方案是很烦琐的那种将得到的参数重新编码来实现的|new String(request.getParameter("para name").getBytes("encoding name"))|而post方案是比较简单而方便的,也提倡使用这种方式,因为可以基于filter来管理编码<br />tomcat可以通过设置在server.xml里的Connector元素下设置URIencoding="gbk"参数来让get使用post的方案(即get和post都使用request.setCharactorEncoding("UTF-8"),request.getParameter("para name") )具体设置参考http://www.javaeye.com/topic/131542,不过在weblogic下无解(我个人还没发现如何实现),weblogic好像在解析get参数后自己又用什么编码格式包装过......其实AJAX get根本没有普通请求get请求作为标签的作用,我们完全可以不使用get,而只使用post<br /><br />测试用的jsp和servlet在下面,丢到一个项目里,在web.xml里配置servlet后运行可以看到效果,servlet的url-pattern是这个&lt;url-pattern>/GetAndPostExample&lt;/url-pattern><br /><br />getAndPostExample.jsp<br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.Date"  contentType="text/html; charset=gbk"%>
&lt;html>
	&lt;head>
		&lt;title>发送带参数的信息到服务器，以及get,post的区别&lt;/title>
		&lt;script type="text/javascript">
			var xmlHttp;			
			function show()
				{
				document.getElementById("show").value=document.getElementById("firstName").value;
				}
			function createXMLHttpRequest()
				{
				if (window.ActiveXObject)
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				else if (window.XMLHttpRequest)
					xmlHttp = new XMLhttpRequest();
				}
			
			function createQueryString()
				{
				var firstName = document.getElementById("firstName").value;
				var secondName = document.getElementById("secondName").value;
				var birthday = document.getElementById("birthday").value;
				
				var queryString = "firstName="+firstName+"&secondName="+secondName
												+"&birthday="+birthday;
				return queryString;
				}
			
			function doRequestUsingGET()
				{
				createXMLHttpRequest();
				show();
				var queryString = "GetAndPostExample?";
				queryString = queryString + createQueryString()
										+ "&timeStamep=" + new Date().getTime();
				xmlHttp.onreadystatechange = handleStateChange;
				xmlHttp.open("GET",queryString,true);
                                    xmlHttp.setRequestHeader("RequestType","ajax");
				xmlHttp.send(null);
				//alert(queryString);
				}
				
			function doRequestUsingPOST()
				{
				createXMLHttpRequest();
				show();		
				var url = "GetAndPostExample"
				var queryString = createQueryString()+ "&timeStamp="+ new Date().getTime();			
				xmlHttp.open("POST",url,true);
				xmlHttp.onreadystatechange = handleStateChange;
				xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
                                     //设置报头,说明此请求是ajax请求
                                     xmlHttp.setRequestHeader("RequestType","ajax");
				xmlHttp.send(queryString);
				}
				
			function handleStateChange()
				{
				if (xmlHttp.readyState == 4)
					{
					if (xmlHttp.status == 200)
						parseResults();
					}
				}
			
			function parseResults()
				{
				var responseDiv = document.getElementById("serverResponse");
				if (responseDiv.hasChildNodes())
					{
					responseDiv.removeChild(responseDiv.childNodes[0]);
					}
				var responseText = document.createTextNode(xmlHttp.responseText);
				responseDiv.appendChild(responseText);
				}
			
		&lt;/script>
	&lt;/head>
	&lt;body>
		&lt;h1>输入你的姓，名，生日日期&lt;/h1>
		&lt;br>
		
			&lt;table>
				&lt;tr>
					&lt;td>
						姓：
					&lt;/td>
					&lt;td>
						&lt;input type="text" name="firstName" id="firstName" value="羽飞">
					&lt;/td>
				&lt;/tr>
					&lt;td>
						名：
					&lt;/td>
					&lt;td>
						&lt;input type="text" name="secondName" id="secondName" value="翼">
					&lt;/td>
				&lt;tr>
				&lt;/tr>
				&lt;tr>
					&lt;td>
						生日：
					&lt;/td>
					&lt;td>
						&lt;input type="text" name="birthday" id="birthday" value="五月">
					&lt;/td>
					&lt;td>
						&lt;input type="text" name="show" id="show">
					&lt;/td>
				&lt;/tr>
			&lt;/table>
		&lt;form action="#">
			&lt;input type="button" value="使用GET提交" onclick="doRequestUsingGET();">
			&lt;br>
			&lt;input type="button" value="使用POST提交" onclick="doRequestUsingPOST();">
		&lt;/form>
		&lt;br>
		&lt;br>		
		&lt;h2>服务器返回信息：&lt;/h2>		
		&lt;div id="serverResponse">
		&lt;/div>
	&lt;/body>
&lt;/html>
</pre><br /><br />GetAndPostExample.java<br /><pre name="code" class="java">
package yufei;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GetAndPostExample extends HttpServlet
	{
		protected void processRequest(HttpServletRequest request,
				HttpServletResponse response, String method1)
				throws ServletException,IOException
				{
				//设置文本类型(content type)
				response.setContentType("text/xml");
                                     //设置文本类型的编码格式
				response.setCharacterEncoding("GBK");
				response.setHeader("Cache-Control","no-cache");
				
				String firstName =null;
				String secondName = null;
				String birthday = null;
                                    //无论是get还是post,都要使用下面这句
                                    request.setCharacterEncoding("UTF-8");
				if (method1.equals("GET"))
				{			     
				 firstName = new String(request.getParameter("firstName").getBytes("ISO8859-1"));
				 secondName = new String(request.getParameter("secondName").getBytes("ISO8859-1"));
				 birthday = new String(request.getParameter("birthday").getBytes("ISO8859-1"));
				}
				else if (method1.equals("POST"))
				{				 			 firstName = request.getParameter("firstName");
				 secondName = request.getParameter("secondName");
				 birthday = request.getParameter("birthday");
				}	
				String responseText = "Hello " + firstName + " " + secondName
								+ " 你的生日是 " + birthday + " " + "(method: " + method1 + ")";				
				PrintWriter out = response.getWriter();
				out.println(responseText);
				
				out.close();
				}
		protected void doGet(HttpServletRequest request,
				HttpServletResponse response)
				throws ServletException,IOException
				{
				processRequest(request,response,"GET");
				}
		protected void doPost(HttpServletRequest request,
				HttpServletResponse response)
				throws ServletException,IOException
				{
				processRequest(request,response,"POST");
				}
	}
</pre><br /><br />-<br />-<br /><br />当我们的ajax请求只使用post(tomcat下可以实现get和post同样方案)请求时,我们可以使用过滤器来实现其编码设置,就可以把servlet中的request.setCharactorEncoding提出来,去掉servlet里的request.setCharactorEncoding("encoding name"),加入下面的过滤器<br />根据fins大大的指导,将过滤器重写为可以区分普通请求和ajax请求的样式了(ajax请求中设置了header)<br /><br />SetCharacterEncodingFilter.java<br /><pre name="code" class="java">
package yufei;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;

public class CharactorEncodingFilter implements Filter
	{
	public CharactorEncodingFilter()
		{
		super();
		}
	private FilterConfig filterConfig;
	private String ajaxEncoding = "UTF-8";
	private String commonEncoding;
	protected boolean ignore = true;
	public void init(FilterConfig filterConfig) throws ServletException
		{
		this.filterConfig = filterConfig;
		commonEncoding = filterConfig.getInitParameter("CommonRequestEncoding");
		String value = filterConfig.getInitParameter("ignore");
		if (value == null)
			this.ignore = true;
		else if (value.equalsIgnoreCase("true"))
			this.ignore = true;
		else if (value.equalsIgnoreCase("yes"))
			this.ignore = true;
		else
			this.ignore = false;
		}

	public void doFilter(ServletRequest req, ServletResponse res,
		FilterChain filterChain)

		{
		try
			{
			HttpServletRequest request = (HttpServletRequest) req;
			if (ignore || (request.getCharacterEncoding() == null))
				{
				if (request.getHeader("RequestType") != null
					&& request.getHeader("RequestType")
						.equalsIgnoreCase("ajax"))
					{
					request.setCharacterEncoding(ajaxEncoding);
					}
				else if (commonEncoding != null)
					{
					request.setCharacterEncoding(commonEncoding);
					}
				else
					{
					request.setCharacterEncoding("UTF-8");
					}
				}
			filterChain.doFilter(req, res);
			}
		catch (IOException e)
			{
			e.printStackTrace();
			}
		catch (ServletException e)
			{
			e.printStackTrace();
			}
		}
	public void destroy()
		{
		this.commonEncoding = null;
		this.filterConfig = null;
		}
	}
</pre><br /><br />web.xml加入如下过滤器配置<br /><pre name="code" class="java">
	&lt;filter>
		&lt;filter-name>CharactorEncoding&lt;/filter-name>
		&lt;filter-class>org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class>
                  &lt;!-- 设置编码格式到initparameter里去 -->
		&lt;init-param>
			&lt;param-name>CommonRequestEncoding&lt;/param-name>
			&lt;param-value>GBK&lt;/param-value>
		&lt;/init-param>		
	&lt;/filter>
	&lt;filter-mapping>
		&lt;filter-name>CharactorEncoding&lt;/filter-name>
		&lt;url-pattern>/*&lt;/url-pattern>
	&lt;/filter-mapping>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/131962#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Oct 2007 14:45:58 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/131962</link>
        <guid>http://yufei.javaeye.com/blog/131962</guid>
      </item>
      <item>
        <title>Java 跨服务器(tomcat和weblogic)的中文编码解决方法</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/131542" style="color:red;">http://yufei.javaeye.com/blog/131542</a>&nbsp;
          发表时间: 2007年10月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文要解决的问题是使用同一种编码方案而能在不同服务器下都解决中文乱码问题,我只在tomcat和weblogic下试验过,因为这是最常用的两种服务器(就是一套方案要在tomcat和weblogic下无论是get请求还是post请求都要正常编码---ajax请求不再此文讨论中,ajax请求不同一般的请求)<br />我使用的是<br /> tomcat5.5.20<br /> weblogic server 9<br /><br />首先大家找个项目把下面3个文件都随便丢到一个目录中取,要相同目录<br />为了方便,我采用的Jsp,因为修改了不用重新加载,方便测试,至于Servlet只要把下面这样东西对照一下就没问题了<br /><br />&lt;%@ contentType="text/html; charset=GBK" %><br />     对应response.setContentType("text/html; charset=GBK") <br />     建议这样来设置，分开类型和编码<br />          response.setContentType("text/html")<br />         response.setCharactorEncoding("GBK")<br /><br />在weblogic和tomcat里都运行看看效果<br /><br />testEncoding.jsp<br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.Date" contentType="text/html; charset=GBK"%>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
    &lt;title>My JSP 'test1.jsp' starting page&lt;/title>
  &lt;/head>  
  &lt;body>
	&lt;h5>提交到getEncoding1.jsp&lt;/h5>&lt;br>
    &lt;a href="getEncoding1.jsp?aaa=羽飞&bbb=苍月无影">get请求&lt;/a>
	&lt;form action="getEncoding1.jsp" method="post">
		&lt;input type="text" name="aaa" value="羽飞"/>
		&lt;input type="text" name="bbb" value="苍月无影"/>
		&lt;input type="submit" value="提交"/>
	&lt;/form>
	&lt;h5>提交到getEncoding2.jsp&lt;/h5>&lt;br>
	&lt;a href="getEncoding2.jsp?aaa=羽飞&bbb=苍月无影">get请求&lt;/a>
	&lt;form action="getEncoding2.jsp" method="post">
		&lt;input type="text" name="aaa" value="羽飞"/>
		&lt;input type="text" name="bbb" value="苍月无影"/>
		&lt;input type="submit" value="提交"/>
	&lt;/form>
  &lt;/body>
&lt;/html>
</pre><br /><br />getEncoding1.jsp<br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.Date" contentType="text/html; charset=gbk"%>
&lt;%
	request.setCharacterEncoding("GBK");
%>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
	&lt;title>getEncoding1.jsp&lt;/title>
  &lt;/head>  
  &lt;body>
    &lt;%	
		String s1 = request.getParameter("aaa");
		String s2 = request.getParameter("bbb");
	%>
	request.setCharacterEncoding("GBK");&lt;br>
	String s1 = request.getParameter("aaa");&lt;br>
	&lt;%=s1 %>&lt;br>
	String s2 = request.getParameter("bbb");&lt;br>
	&lt;%=s2%>
  &lt;/body>
&lt;/html>
</pre><br /><br />getEncoding2.jsp<br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.Date" contentType="text/html; charset=gbk"%>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
	  &lt;title>getEncoding2.jsp&lt;/title>
  &lt;/head>  
  &lt;body>
    &lt;%	
		String s1 = new String(request.getParameter("aaa").getBytes("ISO8859-1"));
		String s2 = new String(request.getParameter("bbb").getBytes("ISO8859-1"));
	%>	
	String s1 = new String(request.getParameter("aaa").getBytes("ISO8859-1"));&lt;br>
	&lt;%=s1 %>&lt;br>
	String s2 = new String(request.getParameter("bbb").getBytes("ISO8859-1"));&lt;br>
	&lt;%=s2%>
  &lt;/body>
&lt;/html>
</pre><br /><br />从getEncoding1.jsp和getEncoding2.jsp的编码方案来看,差别就在于一个设置了request的编码格式，一个没有设置，没有设置request编码格式的在取得参数的时候重新进行了一次编码<br /><br />从运行状况来看，第一种方式的get请求在tomcat下会出现乱码,第二种方式在weblogic和tomcat都能正常工作<br /><br />但是显然第二种方式太烦琐,而且当我们使用struts等框架时会变得棘手<br /><br />第一种方式显然更好用,也更优雅,我们可以在web.xml里设置编码格式,然后使用filter从initparameter里读出编码格式,然后设置request的编码格式,管理也方便,不过目前在tomcat下的get请求会出现乱码,要解决这个问题就需要在server.xml里配置一项参数,server.xml在tomcat根目录/config文件夹下,tomcat5 post和get使用了不同的编码格式,而tomcat4使用的是相同格式,如果你使用tomcat4,就不会出现乱码<br /><pre name="code" class="java">
&lt;Connector port="8888" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="tru e" URIEncoding="gbk"/>
&lt;!-- 配置URIEncoding="gbk" 这里的编码格式一定要和你的页面编码格式一致 -->
</pre><br /><br />现在重新启动tomcat,看看第一种编码格式是不是在tomcat下是不是能正常显示啦^_^<br /><br />-<br />-<br /><br />PS:javaeye出bug了?点保存草稿就发出来了
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/131542#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Oct 2007 21:51:25 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/131542</link>
        <guid>http://yufei.javaeye.com/blog/131542</guid>
      </item>
      <item>
        <title>SSH2: Struts2 + Spring + Hibernate 的登录</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/131071" style="color:red;">http://yufei.javaeye.com/blog/131071</a>&nbsp;
          发表时间: 2007年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用分层结构,包括 dao,service,control,web层<br /><br />Struts2 集成 Spring 需要以下几个步骤<br /><br />1 加入struts2-spring-plugin-2.0.9.jar到项目中(web项目就是丢到/WEB-INF/lib中)<br /><br />2 Web.xml文件里加入以下listener<br /><pre name="code" class="java">
&lt;listener>
    &lt;listener-class>org.springframework.web.context.ContextLoaderListener&lt;/listener-class>
&lt;/listener>
&lt;!--默认加载/WEB-INF 目录下的applicationContext.xml -->
</pre><br />如果需要其它的spring配置文件可以在web.xml中加入以下配置<br /><pre name="code" class="java">
&lt;context-param>
    &lt;param-name>contextConfigLocation&lt;/param-name>
    &lt;param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml&lt;/param-value>
&lt;/context-param>
&lt;!--param-value 中间的多个配置文件可以使用 , 隔开-->
</pre><br /><br />3 在/WEB-INF 目录下新建applicationContext.xml,并在其中配置Struts2的action及其它需要的bean<br /><br />4 在struts.xml中将 &lt;action 元素中 class="" 的属性改为spring配置文件中的id<br /><pre name="code" class="java">
         &lt;!-- spring 配置文件中配置 action -->
 &lt;bean id="loginAction" class="login.LoginAction"
		scope="prototype">
		&lt;property name="userService" ref="userService" />
	&lt;/bean>
</pre><br /><br /><pre name="code" class="java">
         &lt;!-- struts 配置文件中配置 action 注意class属性不再是类带路径全名了 -->
 &lt;action name="Login" class="loginAction">
			&lt;result name="success">/login/success.jsp&lt;/result>
			&lt;result name="error">/login/error.jsp&lt;/result>
	&lt;/action>
</pre><br /><br />-<br />-<br />-<br /><br />Spring 集成 Hibernate 就不累述了,网上到处都有<br /><br />-<br />-<br /><br />附件里有原代码,导入eclipse(需要myeclipse插件),修改数据源,就能运行了<br /><br />数据源在src目录下dataSource.properties里,我将数据源配置在外部properties<br /><br />文件里,spring的配置文件动态载入其内容,如果使用的不是mysql,请注意修改hibernate方言<br /><pre name="code" class="java">
&lt;prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
&lt;/prop>
</pre><br /><br />说明:项目内没有所需要的包(struts2,spring2,hibernate3),导入项目以后需要自己<br /><br />导入相应的三方包,spring使用的是2.0<br /><br />-<br /><br />struts2 好像支持不了spring2.0 基于 XML Schmea 的配置,基于这个配置事务应用程序就出错,如果有人知道怎么在struts2集成spring2中使用spring2的xml Schmea的配置,请告知
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/131071#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 11 Oct 2007 14:35:11 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/131071</link>
        <guid>http://yufei.javaeye.com/blog/131071</guid>
      </item>
      <item>
        <title>String.split 一些特殊符号的输入情况</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/129026" style="color:red;">http://yufei.javaeye.com/blog/129026</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
public class StringSplit
	{
	public static void main(String[] args)
		{
		String str1 = "aa.bb.cc.dd.ee";
		String[] s1 = str1.split("\\.");
		System.out.println(s1.length);
		for (String s : s1)
			{
			System.out.println(s);
			}
		String str2 = "aa|bb|cc|dd|ee";
		String[] s2 = str2.split("\\|");
		System.out.println(s2.length);
		for (String s : s2)
			{
			System.out.println(s);
			}
		String str3 = "aa1bb|cc/dd-ee";
		String[] s3 = str3.split("1|\\||/|-"); // 可以使用|来隔开多个条件
		System.out.println(s3.length);
		for (String s : s3)
			{
			System.out.println(s);
			}
		String str4 = "aa\\bb\\cc\\dd\\ee";
		try
			{
			String[] s4 = str4.split("\\\\"); // 匹配 \ 此斜杠还真......
			System.out.println(str4);
			System.out.println("\\\\");
			System.out.println(s4.length);
			for (String s : s4)
				{
				System.out.println(s);
				}
			}
		catch (PatternSyntaxException p)
			{
			System.out.println(p.getDescription());
			System.out.println(p.getPattern());
			}
		}
	}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/129026#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Oct 2007 22:25:36 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/129026</link>
        <guid>http://yufei.javaeye.com/blog/129026</guid>
      </item>
      <item>
        <title>吃坏肚子了</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/128292" style="color:red;">http://yufei.javaeye.com/blog/128292</a>&nbsp;
          发表时间: 2007年09月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          吃坏肚子了<br />貌似轻微的食物中毒......<br />好多天没有缓过劲来
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/128292#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Sep 2007 20:06:16 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/128292</link>
        <guid>http://yufei.javaeye.com/blog/128292</guid>
      </item>
      <item>
        <title>Eclipse中能够减少开发中浪费时间的一个小技巧</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/126279" style="color:red;">http://yufei.javaeye.com/blog/126279</a>&nbsp;
          发表时间: 2007年09月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="http://yufei.javaeye.com/upload/picture/pic/5457/339080bb-3f1d-4b4a-8e42-9285e18096df.jpg" /><br /><br /><br /><span style="font-size: 18pt">方法一<br />优点:简单快捷<br />缺点:不能随时看到倒入的内容有哪些</span><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5458/e8515d72-ad54-413e-aec0-a1ff5b3c4676.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5459/b59f6e65-8576-4c79-9577-abbdeca2d142.jpg" /><br /><br /><br /><span style="font-size: 18pt">方法二<br />优点就是上个的缺点<br />缺点就是上个的优点</span><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5464/ba450b06-137c-4f01-86a3-b69a86943807.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5461/ec6f8308-b315-4582-9afa-74a54adbbd4a.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5462/acf2e7d4-3981-4070-8f9c-dc7e41ae2e98.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5463/bff404d3-4a71-4a69-a1b0-1a1c3e17743d.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5465/220461af-8990-42f1-a8a1-c50eff6ee530.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/126279#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Sep 2007 12:15:06 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/126279</link>
        <guid>http://yufei.javaeye.com/blog/126279</guid>
      </item>
      <item>
        <title>Struts 2 自学之路: 4 理解Action</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/125944" style="color:red;">http://yufei.javaeye.com/blog/125944</a>&nbsp;
          发表时间: 2007年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容简介: <br />	介绍action是如何匹配表单元素,以及数据的传递<br /><br />需要注意的事项: <br />	我修改了tomcat端口,所以你们看到的http://127.0.0.1:8888/里的8888,要以你自己的tomcat端口为准<br />	修改了xml文件一定要重新启动tomcat或者重新热部署<br /><br />我就以index.jsp和HelloAction.java来讲解<br />index.jsp的表单部分代码<pre name="code" class="java">
    &lt;form action="Login.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
</pre><br /><br />HelloAction.java<pre name="code" class="java">
package yufei.hello;

public class HelloAction
	{
	private String username;
	private String password;
	public String getPassword()
		{
		return password;
		}
	public void setPassword(String password)
		{
		this.password = password;
		}
	public String getUsername()
		{
		return username;
		}
	public void setUsername(String username)
		{
		this.username = username;
		}
	public String execute()
		{
		String strReturn = "error";
		if (username.equals("yufei"))
			strReturn = "success";
		return strReturn;
		}
	}
</pre><br /><br />只要我们的action里有相应的属性(成员变量)名和表单里的文本框的name属性一致,然后再生成其getter和setter方法<br />struts就能自动取得其值,这里就是表单里的文本框中的name="username",name="password"对应HelloAction中的属性<br />username,password<br /><br />以面向对象的编程思想,上面action中的username和password很明显是应该属于user(用户)这个对象<br />Struts 2 也为我们提供了Pojo高级访问的支持,现在我们打开上次的工程,<a href="http://yufei.javaeye.com/blog/125743" target="_blank"><span style="color: blue">没有到这里这里下载</span></a><br />我们新建一个包yufei.pojo,在包里新建一个pojo类User,再新建一个类HelloAction,然后新建一个pojo.xml<br />User.java<pre name="code" class="java">
package yufei.pojo;

public class User
	{
	// POJO 类
	private String username;
	private String password;
	public String getPassword()
		{
		return password;
		}
	public void setPassword(String password)
		{
		this.password = password;
		}
	public String getUsername()
		{
		return username;
		}
	public void setUsername(String username)
		{
		this.username = username;
		}
	
	}
</pre><br /><br />HelloAction.java和以前的比有所变动<pre name="code" class="java">
public class HelloAction
	{
	// 使用刚新建的User对象
	private User user;
	public User getUser()
		{
		return user;
		}
	public void setUser(User user)
		{
		this.user = user;
		}
	public String execute()
		{
		String strReturn = "error";
		// 使用user对象的username属性
		if (user.getUsername().equals("yufei")
				&& user.getPassword().equals("yufei"))
			strReturn = "success";
		return strReturn;
		}
	}
</pre><br /><br />pojo.xml<pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;package name="yufei.pojo" extends="struts-default">
		&lt;action name="Pojo" class="yufei.pojo.HelloAction">
			&lt;result name="success">/pojo/welcome.jsp&lt;/result>
			&lt;result name="error">/pojo/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />然后在src目录下的struts.xml根元素里加上以下这行<br /><pre name="code" class="java">
	&lt;include file="yufei/pojo/pojo.xml"/>
</pre><br /><br />接下来需要页面了,在WebRoot新建一个文件夹,命名为pojo,我们把WebRoot下的index.jsp,error.jsp,welcome.jsp复制到<br />pojo文件夹里,然后修改这三个文件,error.jsp和welcome.jsp也只是需要加入识别其具体位置的信息<br /><br />index.jsp<pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>    
    &lt;title>使用Pojo类&lt;/title>
  &lt;/head>
  
  &lt;body>
  	&lt;!-- form 表单提交给Login.action去处理 -->
	&lt;form action="Pojo.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="user.username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="user.password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
  &lt;/body>
&lt;/html>
</pre><br /><br />error.jsp和welcome.jsp的body内容<pre name="code" class="java">
  &lt;!-- welcome.jsp -->
  &lt;body>
    你好啊亲爱滴,我等你很久了
    /pojo/welcome.jsp
  &lt;/body>
  &lt;!-- error.jsp -->  
  &lt;body>
    你是谁啊,我根本不认识你,再不离开我放狗了
    /pojo/error.jsp
  &lt;/body>
</pre><br /><br /><br />接下来我们启动tomcat,然后在浏览器地址栏输入http://127.0.0.1:8888/Struts2Study/pojo/index.jsp<br />我们在表单里填入数据,在用户名和密码都是yufei的情况下,他会跳转到welcome.jsp,其它情况会跳转到error.jsp<br />看我们的Action类中,只有一个user属性,并没有username和password,我们再来看看我们index.jsp里表单里文本框的<br />name属性,分别是user.username,user.password,恩,现在我们应该明白了吧,struts自动帮我们把值填入action类的<br />user属性(pojo类)里的username属性和password属性,在多层应用程序中,这个功能能给我们提供不少的方便<br /><br /><br />-<br /><br />-<br /><br />-<br /><br />-<br /><br />理论上action类不用实现任何接口继承任何类,就象我们之前的程序那样,我们的HelloAction就没有实现任何接口继承任何类<br />不过呢,为了方便,我们一般都是会去继承com.opensymphony.xwork2.ActionSupport这个类,并且重载(override)其execute方法<br /><br />参考javadoc或者翻看愿代码我们可以发现(都在从apache下载的那个压缩包里,如果你下的时完全版)<br />ActionSupport实现了以下这些接口<br />com.opensymphony.xwork2.Action <br />com.opensymphony.xwork2.LoaleProvider <br />com.opensymphony.xwork2.TextProvider <br />com.opensymphony.xwork2.Validateable <br />com.opensymphony.xwork2.ValidationAware <br />com.uwyn.rife.continuations.ContinuableObject <br />java.io.Searializable <br />java.lang.Cloneable<br /><br />com.opensymphony.xwork2.Action接口里定义了5个常量,SUCCESS,ERROR,INPUT,LOGIN,NONE,以及一个方法public String execute(),<br />常量值分别是其小写形式,所以在我们实现了ActionSupport后,就不应该再使用这些"successs","error"字符串常量了,<br />我们可以使用从Action接口继承来的常量SUCCESS和ERROR,实际代码象下面这样<br /><br />yufei.pojo.HelloAction.java修改以后<pre name="code" class="java">
package yufei.pojo;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport
	{
	// 使用刚新建的User对象
	private User user;
	public User getUser()
		{
		return user;
		}
	public void setUser(User user)
		{
		this.user = user;
		}
	@Override
	public String execute()
		{
		String strReturn = ERROR;
		// 使用user对象的username属性
		if (user.getUsername().equals("yufei")
				&& user.getPassword().equals("yufei"))
			strReturn = SUCCESS;
		return strReturn;
		}
	}

</pre><br /><br />其中execute方法上的注释@Override表示其修饰的方法必需是重载的方法,如果此方法不是重载方法,编译期会报错,这样就能<br />保证我们不会因为拼写错误而导致没有重载父类的方法,这个特性是JDK5开始才有的<br />我们可以看到,我们把在执行方法里的"success"和"error"换成了SUCCESS和ERROR,我们重起tomcat,再来测试,效果和刚才一样<br /><br /><br />从com.opensymphony.xwork2.Validateable和com.opensymphony.xwork2.ValidationAware 这两个接口可以看出,我们继承<br />ActionSupport,就能使用Struts的表单数据校验功能,数据校验不在本文讨论范围<br /><br />在我们进行web开发时,servlet的一些对象是经常用到的,如session,request,response等,在struts 1 中,是通过execute的参数<br />传入,象这样:<br />public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)<br />而struts2 的execute是不带参数的(就算修改了默认执行方法,但是执行方法的规则之一就是方法不能带参数)要获得上述对象，可以使用<br />Struts 2.0中com.opensymphony.xwork2.ActionContext类,我们可以通过它的静态方法getContext()获取当前Action的上下文对象。<br /><br />另外,org.apache.struts2.ServletActionContext作为辅助类（Helper Class），可以帮助您快捷地获得这几个对象。 <br />HttpServletRequest request = ServletActionContext.getRequest(); <br />HttpServletResponse response = ServletActionContext.getResponse(); <br />HttpSession session = request.getSession();<br /><br />如果你只是想访问session的属性（Attribute），你也可以通过ActionContext.getContext().getSession()获取或添加session范围（Scoped）的对象<br /><br />下面我们来做个试验,当我们登录成功,将用户名密码放入session,然后在成功页面显示我们的登录用户名和密码<br />在yufei.pojo.HelloAction.java里加入以下方法<br /><pre name="code" class="java">
public String sendPara()
	{
	String strReturn = ERROR;
	if (user.getUsername().equals("featherfly"))
		{
		strReturn = SUCCESS;
		// 将username和password的值加入session里
		ActionContext.getContext().getSession().put("username",user.getUsername());
		ActionContext.getContext().getSession().put("password",user.getPassword());
		}
	return strReturn;
	}
</pre><br /><br />修改pojo.xml为以下形式<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;package name="yufei.pojo" extends="struts-default">
		&lt;action name="Pojo" class="yufei.pojo.HelloAction">
			&lt;result name="success">/pojo/welcome.jsp&lt;/result>
			&lt;result name="error">/pojo/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
	&lt;!-- 新加入部分 -->
	&lt;package name="yufei.pojo1" extends="struts-default" namespace="/pojo">
		&lt;action name="Pojo" class="yufei.pojo.HelloAction" method="sendPara">
			&lt;result name="success">/pojo/welcome1.jsp&lt;/result>
			&lt;result name="error">/pojo/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />然后在WebRoot/pojo文件夹里新建一个welcome1.jsp,我们加入访问session的内容,再修改其标识信息即可<br /><pre name="code" class="java">
 &lt;body>
    &lt;!-- 使用EL表达式得到session对象里的username属性 -->
    你好啊亲爱滴${sessionScope.username},我等你很久了&lt;br>
    登录密码是:${sessionScope.password}&lt;br>
    /pojo/welcome1.jsp
  &lt;/body>
</pre><br /><br />最后修改index.jsp,在其中再添加一个表单,提交给namespace="/pojo" name="Pojo" 去处理,这个action定义了执行<br />方法,会和上面的表单在执行方法上不一样,这个只要username等于featherfly就跳转到/pojo/welcome1.jsp<br /><br /><pre name="code" class="java">
    &lt;form action="Pojo.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="user.username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="user.password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
    &lt;center>&lt;p>用户名为featherfly,action="/Struts2Study/pojo/Pojo.action"&lt;/p>&lt;/center>
    &lt;form action="/Struts2Study/pojo/Pojo.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="user.username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="user.password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
</pre><br /><br />现在,重起tomcat,再来打开http://127.0.0.1:8888/Struts2Study/pojo/index.jsp,在下面表单里输入featherfly,密码<br />任意输入,提交,现在我们是不是看到了登录名字和密码了啊? (上面的表单的表单成功的用户名和密码都是yufei)<br /><br /><br />项目文件在附件中
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/125944#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Sep 2007 15:07:00 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/125944</link>
        <guid>http://yufei.javaeye.com/blog/125944</guid>
      </item>
      <item>
        <title>Struts 2 自学之路: 3.2 名称空间(namespace)详解</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/125743" style="color:red;">http://yufei.javaeye.com/blog/125743</a>&nbsp;
          发表时间: 2007年09月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容简介: <br />	这篇文章将会通过实例详细介绍 struts.xml 文件中 package 元素下 namespace 属性的作用<br />          <br />说在前面的话:<br />	namespace的作用是控制相应package下的action的url地址,url地址在web编程中是基础中的基础<br />	我们的程序不同的功能实际上就是对相应url地址的访问来触发的,这个要牢牢掌握,有点象java的classpath<br /><br />需要注意的事项: <br />	我修改了tomcat端口,所以你们看到的http://127.0.0.1:8888/里的8888,要以你自己的tomcat端口为准<br />	修改了xml文件一定要重新启动tomcat或者重新热部署<br /><br /><span style="font-size: 18pt"><span style="color: blue">第一部分</span></span><br />首先我还是废话一下这个基础,这些你都很清楚可以跳过前面这部分<br />先来看一下一些相对路径的不同写法在tomcat里的运行情况,这里我们使用表单的action来介绍<br /><br />打开我们上次的工程,在WebRoot文件夹下新建一个目录namespace,然后在里面新建一个Jsp文件testurl.jsp,<a href="http://yufei.javaeye.com/admin/show/124857" target="_blank"><span style="color: blue">这里下载</span></a><br />其代码如下<br /><br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
&lt;%@taglib prefix="s" uri="/struts-tags"%>
&lt;!-- 使用struts标签必需在这里倒入 -->
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
	&lt;head>
		&lt;title>testurl&lt;/title>
	&lt;/head>
	&lt;body>
		由于struts标签的action和html表单的action在处理上有某些不同&lt;br>
		struts标签的action把以"/"开头的路径优化过,提交下面的表单&lt;br>		
		由于没有test.jsp,肯定全部是404错误,没关系,我们只需要查看其url地址,这足够让我们理解其具体行为了
		&lt;br>
		&lt;br>
		&lt;table border="1">
			&lt;tr>
				&lt;th>
					使用html表单访问test.jsp
				&lt;/th>
				&lt;th>
					使用struts表单标签访问test.jsp
				&lt;/th>
			&lt;/tr>
			&lt;tr>
				&lt;td>
					action="test.jsp"
					&lt;form action="test.jsp" method="post">
						&lt;input type="submit" value="html表单访问test.jsp" />
					&lt;/form>
				&lt;/td>
				&lt;td>
					action="test.jsp"
					&lt;s:form action="test.jsp">
						&lt;s:submit value="struts表单标签访问test.jsp" />
					&lt;/s:form>
				&lt;/td>
			&lt;tr>
			&lt;tr>
				&lt;td>
					action="/test.jsp"
					&lt;form action="/test.jsp" method="post">
						&lt;input type="submit" value="html表单访问test.jsp" />
					&lt;/form>
				&lt;/td>
				&lt;td>
					action="/test.jsp"
					&lt;s:form action="/test.jsp">
						&lt;s:submit value="struts表单标签访问test.jsp" />
					&lt;/s:form>
				&lt;/td>
			&lt;tr>
			&lt;tr>
				&lt;td>
					action="./test.jsp"
					&lt;form action="./test.jsp" method="post">
						&lt;input type="submit" value="html表单访问test.jsp" />
					&lt;/form>
				&lt;/td>
				&lt;td>
					action="./test.jsp"
					&lt;s:form action="./test.jsp">
						&lt;s:submit value="struts表单标签访问test.jsp" />
					&lt;/s:form>
				&lt;/td>
			&lt;tr>
			&lt;tr>
				&lt;td>
					action="../test.jsp"
					&lt;form action="../test.jsp" method="post">
						&lt;input type="submit" value="html表单访问test.jsp" />
					&lt;/form>
				&lt;/td>
				&lt;td>
					action="../test.jsp"
					&lt;s:form action="../test.jsp">
						&lt;s:submit value="struts表单标签访问test.jsp" />
					&lt;/s:form>
				&lt;/td>
			&lt;tr>
			&lt;tr>
				&lt;td>
					action="/Struts2Study/namespace/test.jsp"
					&lt;form action="/Struts2Study/namespace/test.jsp" method="post">
						&lt;input type="submit" value="html表单访问test.jsp" />
					&lt;/form>
				&lt;/td>
				&lt;td>
					action="/namespace/test.jsp"
					&lt;s:form action="/namespace/test.jsp">
						&lt;s:submit value="struts表单标签访问test.jsp" />
					&lt;/s:form>
				&lt;/td>
			&lt;tr>
		&lt;/table>
	&lt;/body>
&lt;/html>
</pre><br /><br />运行上面的例子可以看到结果,从运行结果可以看出,struts的form标签的action是经过优化的<br />当html的form表单的action="/url"(以/开头的url地址)时,其会从http://127.0.0.1:8080这个根开始附加,我们要访问具体信息必需要加上<br />	项目的上下文(context),就是tomcat安装目录下wepapps/context(具体是你工程名字)这个文件夹名字,象这样<br />	&lt;form action="/Struts2Study/namespace/test.jsp" method="post"><br />而struts的form标签的action="/url"(以/开头的url地址)时,struts2帮我们作了优化,他会自动为我们在htpp://127.0.0.1:8080/后面加上<br />	项目的上下文,再附加action后的url,而这也是我们开发时想要的本意,象这样&lt;s:form action="/namespace/test.jsp"><br />其余的都是一样的<br />action="url" 和 action="./url" 都表示当前路径<br />action="../" 表示上级路径<br /><br />上面的表单实际上是被当作超链接来使用的(没有表单参数,只是跳转),超链接的实际访问效果和表单是一样的 action="test.jsp" 和 <br />&lt;a href="test.jsp"> 都是访问test.jsp,只是表单允许用户输入数据,而超链接办不到<br /><br /><br /><br /><span style="font-size: 18pt"><span style="color: blue">第二部分</span></span><br />接下来就该进入正题了,先把工程以前在根目录的index.jsp,error.jsp和welcome.jsp复制到namespace文件夹里,然后修改其代码<br />再新建两个jsp文件,分别为 error1.jsp,welcome1.jsp,这两个同error.jsp和welcome.jsp一样,只要确认文本就ok<br />index.jsp<pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
&lt;%@taglib prefix="s" uri="/struts-tags"%>
&lt;!-- 要使用struts的标签就要先倒入 -->
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>    
    &lt;title>第一个Struts程序&lt;/title>
  &lt;/head>  
  &lt;body>
  	&lt;center>
	action="NameSpace.action"
	&lt;form action="NameSpace.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
    action="/Struts2Study/namespace/NameSpace.action"
	&lt;form action="/Struts2Study/namespace/NameSpace.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
    action="/Struts2Study/NameSpace.action"
	&lt;form action="/Struts2Study/NameSpace.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
    &lt;br>
    &lt;h5>以下是使用struts的form标签&lt;/h5>
    &lt;br>
    action="NameSpace"
   	&lt;s:form action="NameSpace">
		&lt;s:textfield name="username" label="用户名"/>
		&lt;s:textfield name="password" label="密  码"/>
		&lt;s:submit value="登录"/>
	&lt;/s:form>
	action="/namespace/NameSpace.action"
   	&lt;s:form action="/namespace/NameSpace.action">
		&lt;s:textfield name="username" label="用户名"/>
		&lt;s:textfield name="password" label="密  码"/>
		&lt;s:submit value="登录"/>
	&lt;/s:form>
	action="/NameSpace.action"
   	&lt;s:form action="/NameSpace.action">
		&lt;s:textfield name="username" label="用户名"/>
		&lt;s:textfield name="password" label="密  码"/>
		&lt;s:submit value="登录"/>
	&lt;/s:form>
	&lt;/center>
  &lt;/body>
&lt;/html>
</pre><br /><br />下面来确认error.jsp,welcome.jsp,error1.jsp及welcome1.jsp的body部分<br /><pre name="code" class="java">
&lt;!-- error.jsp -->
&lt;body>
    你是谁啊,我根本不认识你,再不离开我放狗了
    namespace/error.jsp
&lt;/body>

&lt;!-- error1.jsp -->
&lt;body>
  	who are you? i don't know you,i'll call my dog if you won't go&lt;br>
  	namespace/error1.jsp	
&lt;/body>

&lt;!-- welcome.jsp -->
&lt;body>
    你好啊亲爱滴,我等你很久了&lt;br>
    namespace/welcome.jsp
&lt;/body>

&lt;!-- welcome1.jsp -->
&lt;body>
  	hi,darlin,i wait for you for a long time&lt;br>
  	namespace/welcome1.jsp    
&lt;/body>
</pre><br /><br /><br />接下来在新建包yufei.namespace,然后从hello把HelloAction.java复制过去,不用修改代码<br />HelloAction.java<pre name="code" class="java">
package yufei.namespace;

public class HelloAction
	{
	private String username;
	private String password;
	public String getPassword()
		{
		return password;
		}
	public void setPassword(String password)
		{
		this.password = password;
		}
	public String getUsername()
		{
		return username;
		}
	public void setUsername(String username)
		{
		this.username = username;
		}
	public String execute()
		{
		String strReturn = "error";
		if (username.equals("yufei"))
			strReturn = "success";
		return strReturn;
		}
	}
</pre><br /><br />接着我们在yufei.namespace包中新建一个xml文件namespace.xml,并且在struts.xml文件中加入以下内容<br /><pre name="code" class="java">
&lt;!-- 倒入其它配置文件 -->
&lt;include file="yufei/namespace/namespace.xml"/>
</pre><br /><br />namespace.xml的代码如下,这些前篇文章都讲过了,这里不再说了<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;package name="yufei.namespace" extends="struts-default">
		&lt;action name="NameSpace" class="yufei.namespace.HelloAction">
			&lt;result name="success">/namespace/welcome.jsp&lt;/result>
			&lt;result name="error">/namespace/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />接下来我们启动tomcat来测试程序,jsp里的表单action多的就不说了,在第一部分已经废话了很多,这里有个小知识<br />就是使用struts的form标签时,如果是当前路径,可以不带.action,即不是以/或./或../这类开头的,可以看index.jsp代码<br />不过我建议还是每个地方都写上,这样看上去更统一,这点知道就行了,在地址拦输入http://127.0.0.1:8888/Struts2Study/namespace/index.jsp<br />每个表单分别提交一次,我们观察url地址,会发现有两种地址,分别是<br />http://127.0.0.1:8888/Struts2Study/namespace/NameSpace.action<br />http://127.0.0.1:8888/Struts2Study/NameSpace.action<br />而且都能正常到执行,这里先不忙解释,我们对namespace.xml做一些小手脚来继续观察,给package元素加上namespace属性<br />设置其值为namespace="namespace"(这个值代表的其实是路径)<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;!-- 新加上namespace -->
	&lt;package name="yufei.namespace" extends="struts-default" namespace="/namespace">
		&lt;action name="NameSpace" class="yufei.namespace.HelloAction">
			&lt;result name="success">/namespace/welcome.jsp&lt;/result>
			&lt;result name="error">/namespace/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />重新启动tomcat(或重热部署),然后在打开namespace下的index.jsp,现在我们再来提交表单试试<br />现在出现了异常情况...当我们提交表单到http://127.0.0.1:8888/Struts2Study/NameSpace.action时发生了异常<br />而我们提交到http://127.0.0.1:8888/Struts2Study/namespace/NameSpace.action却能正常执行<br />原因就在于这个namespace属性的设置<br />我们来回顾一下struts2的基本流程,当客户发生请求以后,触发struts2的FilterDispatcher过滤器(默认配置是所有请求都会触发)<br />如果请求是以.action结尾,FilterDispatcher会去struts.xml里面查找action元素的name属性配置,找到匹配的然后运行其class<br />属性指定的类<br />在struts2基本流程里是这样说明的,现在补充一点,匹配的不光是name属性,还有package的namespace属性,<span style="color: red">现在我这里就来讲一下<br />struts2是如何去查找匹配action的,这是我自己的理解,没有任何资料参考,如有什么不妥之处请邮件告知(yufei@wapke.cn)</span><br />以今天这个index.jsp里 action=NameSpace.action 来举例说明,当我们提交此表单时,会请求以下这个url资源<br />http://127.0.0.1:8888/Struts2Study/namespace/NameSpace.action<br />这时filterdispatcher触发,然后其发现请求url是以.action结尾,然后其就去配置文件里面查找,匹配的方式应该是<br />将http://127.0.0.1:8888/Struts2Study请求资源的根路径去掉,然后再将最后的.action去掉留下中间那部分(这里就是<br />/namespace/NameSpace),然后将剩下这部分再分为两个部分,即最后一个/以前的部分,和最后一个/以后部分,分解以后就是这样,<br />/namesapce(最后一个/以前,不包括最后一个/)和NameSpace(最后一个/以后,不包括最后一个/)然后拿分解出来的第一部分去<br />和package元素里的namespace比对,找到相同的就在这个package元素里找其子action元素的name属性和分解出来的第二部分对比<br />,相同就执行其class属性对应的类,如果找不到,就会到默认namespace里去找,默认namespace是"",namesapce="" 和 namespace="/" 和 namespace空缺不写 是一样的效果,都代表在项目根路径上去匹配action的name,以上面的url举例就是<br />http://127.0.0.1:8888/Struts2Study/到这里去找NameSpace.action,<br />如果剩下这部分/以前没有内容,就代表到默认名称空间去找<br />注意:namespace属性的值等于"/"代表根空间,""代表默认空间,只是默认情况下二者大致相当,指执行结果<br /><br />为了明白什么是先查找指定名称空间,再查找默认名称空间,我们把namespace.xml的配置文件改动一下<br />把package元素里的namespace属性去掉(你也可以分别试着让namespace=""或namesapce="/"来看效果)<br /><br /><pre name="code" class="java">
&lt;!-- 去掉namespace属性 -->
&lt;package name="yufei.namespace" extends="struts-default">
</pre><br /><br />这样又回到一开始的配置了,然后我们来执行,会有两种url地址,但是两种地址都能正常运行<br />http://127.0.0.1:8888/Struts2Study/namespace/NameSpace.action<br />http://127.0.0.1:8888/Struts2Study/NameSpace.action<br />第二种情况还比较好理解,这个就是上面说的/以前没有内容,就代表到默认名称空间查找<br />第一种情况要复杂点,被FilterDispatcher拦截下来后,它先到namespace="/namespace"里面去找<br />,没有找到,然后又到namespace=""去查找,找到了,所以也执行了<br /><br />接下来我们再来把配置文件的 namespace改回 namesapce="namespace"<br />修改配置文件以后http://127.0.0.1:8888/Struts2Study/NameSpace.action会报异常<br />原因是/以前没有内容,就代表到默认名称空间查找,而配置文件里根本没有配置有默认空间的package,所以肯定找不到<br />给index.jsp再添加一个表单,提交给一个更容易看明白的地址<br /><br /><pre name="code" class="java">
	action="/namespace1/NameSpace.action"
   	&lt;s:form action="/namespace1/NameSpace.action">
		&lt;s:textfield name="username" label="用户名"/>
		&lt;s:textfield name="password" label="密  码"/>
		&lt;s:submit value="登录"/>
	&lt;/s:form>
	&lt;!-- 加入到最后 -->	
</pre><br /><br />这个表单提交到以下地址,报了异常<br />http://127.0.0.1:8888/Struts2Study/namespace1/NameSpace.action<br />这个被FilterDispatcher拦截下来后,先到namespace="/namespace1"里面去找,没有找到,然后又到namespace=""去查找<br />还是没有找到,所以还是报异常<br /><br /><br /><br />最后我们来做一个同名action的试验来结束名称空间的讲解,看不同名称空间,同名action是某可以使用<br />修改namespace.xml如下<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;!-- 新加上namespace -->
	&lt;package name="yufei.namespace" extends="struts-default" namespace="/namespace">
		&lt;action name="NameSpace" class="yufei.namespace.HelloAction">
			&lt;result name="success">/namespace/welcome.jsp&lt;/result>
			&lt;result name="error">/namespace/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
	&lt;!-- package name不能出现重复的 -->
	&lt;package name="yufei.namespace1" extends="struts-default" namespace="/namespace1">
		&lt;action name="NameSpace" class="yufei.namespace.HelloAction">
			&lt;!-- 执行的类都是一样的,所以要让其跳转到不同的地方来看效果 -->
			&lt;result name="success">/namespace/welcome1.jsp&lt;/result>
			&lt;result name="error">/namespace/error1.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />现在我们进入index.jsp,然后来提交我们刚才加入在最后的表单,现在我们是不是看到一堆烦人的鸟文了啊^_^<br /><br /><br /><br />项目文件在附件中
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/125743#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Sep 2007 23:29:00 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/125743</link>
        <guid>http://yufei.javaeye.com/blog/125743</guid>
      </item>
      <item>
        <title>Eclipse中使用自定义模板来弥补Myeclipse没有新建Filter的功能</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/125012" style="color:red;">http://yufei.javaeye.com/blog/125012</a>&nbsp;
          发表时间: 2007年09月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Myeclipse插件,并没有为我们提供Filter的新建功能,为此我们不得不每次都去新建个类,然后输入那繁琐的重复代码,这完全就是浪费时间,时间应该花在更有用的事情上,而不是这类重复操作,象下面这些内容如果要自己来写,完全时浪费时间,我们完全可以创建一个模板来让它自动帮我们完成以下内容<br /><br /><pre name="code" class="java">
package test;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class FilterTemplate implements Filter
	{

	/**
	 * Constructor of the object.
	 */
	public FilterTemplate()
		{
		super();
		}

	private FilterConfig filterConfig;

	// Handle the passed-in FilterConfig	
	public void init(FilterConfig filterConfig) throws ServletException
		{
		this.filterConfig = filterConfig;
		}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain filterChain)

		{
		try
			{
			HttpServletRequest request = (HttpServletRequest) req;
			HttpServletResponse response = (HttpServletResponse) res;
			HttpSession session = request.getSession();

			// 这里放到达目的地前(进入)处理代码

			filterChain.doFilter(req, res);

			// 这里放到达目的地(离开)的处理代码

			}
		catch (IOException e)
			{
			e.printStackTrace();
			}
		catch (ServletException e)
			{
			e.printStackTrace();
			}
		}
	/**
	 * Destruction of the servlet. &lt;br>
	 */
	public void destroy()
		{
		// Just puts "destroy" string in log
		// Put your code here
		}

	}
</pre><br /><br /><br />打开Eclipse,选择首选相,然后根据图片提示操作<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5292/edf6df44-25b3-454a-951b-ef80c08135cf.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5293/5a96322f-421a-4963-84c2-742aba73501c.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5294/d51c4f0a-650e-4536-9afc-287678e57148.jpg" /><br /><br /><pre name="code" class="java">
package ${enclosing_package} ;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ${primary_type_name} implements Filter
	{

	/**
	 * Constructor of the object.
	 */
	public ${primary_type_name}()
		{
		super();
		}

	
	private FilterConfig filterConfig;

	// Handle the passed-in FilterConfig	
	public void init(FilterConfig filterConfig) throws ServletException
		{
		this.filterConfig = filterConfig;
		}

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain)

		{
		try
			{
			HttpServletRequest request = (HttpServletRequest) req;
			HttpServletResponse response = (HttpServletResponse) res;
			HttpSession session = request.getSession();
			
			// 这里放到达目的地前(进入)处理代码
			
			
			filterChain.doFilter(req,res);
			
			// 这里放到达目的地(离开)的处理代码
			
			} catch (IOException e)
			{
			e.printStackTrace();
			} catch (ServletException e)
			{
			e.printStackTrace();
			}
		}
	/**
	 * Destruction of the servlet. &lt;br>
	 */
	public void destroy()
		{
		// Just puts "destroy" string in log
		// Put your code here
		}

	}
</pre><br /><br /><br />代码中有两处变量<br /><br />${enclosing_package}  外层包名<br />${primary_type_name}  不带扩展名的文件名<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5296/32d04e9b-8f8e-4b50-9ef0-4ddeab9f196b.jpg" /><br /><br />用图片结合代码那两个变量的意思就很明显了,因为模板里其它部分是死的,就只有包和类名是活的,所以需要动态的生成<br /><br />接下来就是使用这个模板了<br />我们只需要新建一个class(任意包下都无所谓),然后Ctrl+A全选,接着delete,在编辑器中输入filter,按Alt+/(代码辅助快捷键),选择filter - filter模板(注意,如果filter只有单一辅助内容,不会提示图中的框,会把唯一的内容直接输出到编辑器,你可以只输入f,然后Alt+/)<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5295/12a89154-4a9b-4775-bfce-96a22c47ef5c.jpg" /><br /><br /><br />接着我们打开web.xml加入相应的配置信息,如果你觉得配置信息也麻烦(毕竟最少都有8行),完全可以在xml编辑器下也创建模板,由于xml编辑器不是eclipse默认提供,而是通过插件提供的,所以我们要到相应插件的选相下去修改,笔者使用的是myeclipse的xml编辑器,所以是在首选相下的myeclipse里,见下图<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5297/953c899f-9089-42dd-aa73-2c029b5f27e9.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5298/8067dbfb-eeb6-4f88-90a1-c29aaaa9dc3d.jpg" /><br /><br />-<br /><br />接下来我们来打开web.xml,然后在web-app标签中间空白处输入filter然后alt+/,就会出现filter 模板提示,见下图<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5299/1b29a469-8e34-48b3-858d-93bb8586faa9.jpg" /><br /><br />-<br /><br />注意一点: 由于xml编辑器不是eclipse默认提供,而是通过插件提供的,所以我们要到相应插件的选相下去修改,那么你打开xml时就要使用你定义了模板的编辑器来打开<br />具体说明参见下图<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5300/449836fa-f9f5-439a-8ef9-0f708b2e47a7.jpg" /><br /><br />-<br />-<br /><br />除了上面的例子,模板还可以用在其它很多地方,只要是出现频率高的重复操作,我们都可以定义一个模板来完成,这样可以节省我们宝贵的时间来做其它有意义的事情
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/125012#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Sep 2007 15:56:00 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/125012</link>
        <guid>http://yufei.javaeye.com/blog/125012</guid>
      </item>
      <item>
        <title>Struts 2 自学之路: 3.1 struts.xml 核心配置实例说明</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/124857" style="color:red;">http://yufei.javaeye.com/blog/124857</a>&nbsp;
          发表时间: 2007年09月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容简介: 掌握 struts.xml 最核心的配置属性<br /><br />Struts 框架的核心配置文件就是 struts.xml 配置文件，该文件主要负责管理 Struts 2 框架的业务控制器 Action。 <br />在默认情况下，Struts 2 框架将自动加载放在 WEB-INF/classes 路径下的 struts.xml文件。所以在第一篇文章中,新建struts.xml时,要求一定要建立在src目录下,该目录下的内容在开发中会被复制到 WEB-INF/classes 目录下(.java文件不会被复制过去,编译好后的.class文件直接被创建在那里面, myeclipse下的web project是这样的)<br /><br />struts.xml 的根元素是struts<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"struts-2.0.dtd">
&lt;!-- 根元素是Struts -->
&lt;struts>

&lt;/struts>
</pre><br /><br />其中最重要的元素是package,是根元素package的子元素<br />package是action元素的父元素<br /><pre name="code" class="java">
&lt;struts>
	&lt;package>
		&lt;action name="" class="">			
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />-<br />-<br /><br />接下来我们就在实践中去看各个元素以及属性的实际用法<br />我们打开第一篇文章中用到的项目,<a href="http://yufei.javaeye.com/admin/show/124610" target="_blank"><span style="color: blue">如果没有请到这里下载</span></a><br /><br />新建一个包yufei.conf,在这个包下新建一个strutsconf.xml,这是个struts的配置文件,我们需要在struts.xml中<br />引入这个文件(因为前面已经提过了,struts2默认载入WEB-INF/classes 路径下的 struts.xml)<br /><br />strutsconf.xml<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	
&lt;/struts>
</pre><br /><br />修改后的struts.xml文件,在&lt;!-- ********** -->之间的是新加的内容<br />代码中会用注释来说明<br /><br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>	
	&lt;package name="yufei.hello" extends="struts-default">	
		&lt;action name="Login" class="yufei.hello.HelloAction">
			&lt;result name="error">/error.jsp&lt;/result>
			&lt;result name="success">/welcome.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
	
	&lt;!-- 
		该元素是struts的子元素
		该元素只有一个属性 file,即需要倒入的外部配置文件
		下面这个写法基本就是其标准形式了
	-->
	&lt;!-- ******************************************** -->
	&lt;include file="yufei/conf/strutsconf.xml" />
	&lt;!-- ******************************************** -->
&lt;/struts>
</pre><br /><br />使用 include 的好处: 当我们开发一个项目,配置文件肯定会写一大堆,如果写在一个配置文件里一定冗长,查看和修<br />改都不方便,所以使用include把配置文件分开来便于查找和修改,完全有理由让struts.xml仅仅是作为一个目录来使用<br />,至于其它配置文件的分配,可以根据模块也可以根据功能来划分<br /><br />-<br />-<br /><br />接下来我们在WebRoot文件夹下新建一个文件夹,取名conf<br />然后把WebRoot文件夹下的index.jsp,welcome.jsp,error.jsp<br />复制到conf文件夹中,修改index.jsp的action属性,再在welcome.jsp和error.jsp加上识别是在conf文件夹下的标识<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5275/e1c47c7f-c53d-4dc1-82db-910022bcb930.jpg" /><br /><br /><pre name="code" class="java">
&lt;!--修改index.jsp中form表单的action为下面这样 -->
&lt;form action="Conf.action" method="post">
</pre><br /><br /><pre name="code" class="java">
 &lt;body>
    你是谁啊,我根本不认识你,再不离开我放狗了
    此页在conf目录下
    &lt;!--上面conf目录这句提示在welcome.jsp和error.jsp中都加上,好识别跳转到的是哪里 -->
  &lt;/body>
</pre><br /><br /><br />在yufei.conf包内新建一个类HelloAction<br />注意,这个类比起以前那个类多了一个方法<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5277/68422203-6ea8-439d-a65d-e76e1b8623af.jpg" /><br /><br /><pre name="code" class="java">
package yufei.conf;

public class HelloAction
	{
	private String username;
	private String password;
	public String getPassword()
		{
		return password;
		}
	public void setPassword(String password)
		{
		this.password = password;
		}
	public String getUsername()
		{
		return username;
		}
	public void setUsername(String username)
		{
		this.username = username;
		}
	public String execute()
		{
		String strReturn = "error";
		if (username.equals("yufei"))
			strReturn = "success";
		return strReturn;
		}
	public String userMethod()
		{
		String strReturn = "error";
		if (username.equals("featherfly"))
			strReturn = "success";
		return strReturn;
		}
	}
</pre><br /><br /><br />然后来配置strutsconf.xml配置文件<br /><br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;package name="yufei.conf.package" extends="struts-default">
		&lt;action name="Conf" class="yufei.conf.HelloAction">
			&lt;result name="success">/conf/welcome.jsp&lt;/result>
			&lt;result name="error">/conf/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br /><br />现在我们可以运行程序来测试新写这个是否成功,启动tomcat,然后在浏览器中输入<br />http://127.0.0.1:8888/Struts2Study/conf/index.jsp 来打开页面<br />(http://127.0.0.1:8888/Struts2Study/ 是你的项目根 tomcat默认端口是8080我修改过)<br /><br />输入yufei应该能看到页面显示<br /><span style="color: blue"> 你是谁啊,我根本不认识你,再不离开我放狗了 此页在conf目录下</span><br />输入其它的应该能看到页面显示<br /><span style="color: blue">你是谁啊,我根本不认识你,再不离开我放狗了 此页在conf目录下</span><br /><br /><br />如果看到以上这些,那么我们进入下一步来讲解package,先给出package的定义<br /><span style="color: red">package是把actions,results,result types,interceptors和stacks分组成逻辑单元的一种方式<br />,以分享一些共同设置,包跟对象一样可以扩展,也可以被"子"包覆盖部分属性</span><br />从以上定义我们可以看出package不仅是作为逻辑分隔,而且还能具有继承的特性<br /><br /><br />package的属性见下图<br /><img src="http://yufei.javaeye.com/upload/picture/pic/5276/bd5dd7c9-7a11-4205-ad42-9cd25f7fc276.jpg" /><br />从图中可以看出, name属性仅仅是个代号(id),我们可以随边取,只要不冲突(不重复),而extends代表继承其它的包<br />里面填参数是其它包的name属性,namespace代表名称空间(下篇文章专门讲这个,这里不再多说),至于abstract,这个<br />和我们写java的abstract类一样,就是让人家来继承的<br />只有name是必需的,不过在默认情况下,extends也是必需的,因为我们需要从struts2默认载入的struts-default.xml<br />文件的struts-default包中继承一些东西,有兴趣可以解压struts2-core-2.0.9.jar找到struts-defautl.xml查看内容<br />我们现在可以做个试验,把extends这项去掉,然后我们重新启动tomcat,在tomcat重新启动时就会报错,这说明确实<br />需要从struts-default.xml继承一些内容<br /><br />-<br />-<br /><br />下面我们来看action,<span style="color: red">action是struts2的基础"工作单元",一个action一般就是一个请求(或点击按钮或提<br />交表单),action元素有两部分,一个友好的名字(URL相关,如Login.action)和一个负责"处理"的类</span><br /><br /><pre name="code" class="java">
	&lt;!-- 
		name表示*.action前面那部分这里即是表示Conf.action
		class表示使用哪个类来处理此请求
		method 是可选属性,表示使用哪个方法来处理,
		       如果缺此项默认调用类中的execute()方法
	-->
	&lt;action name="Conf" class="yufei.conf.HelloAction" method="方法名">
	&lt;/action>
</pre><br /><br />接下来我们再来做一个试验,我们将strutsconf.xml再修改一下,给action添加一个method来改变执行方法<br /><br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;!-- 
		这是上面配置的,现在将其注释起来,在复制一份,然后给其添加method属性
		由于刚才我们新建那个HelloAction类里除了execute()方法外,还有一个
		userMethod()方法
		要调用的方法必需符合以下三个条件
		1 是public 2 返回String 3 没有参数
	&lt;package name="yufei.conf.package" extends="struts-default">
		&lt;action name="Conf" class="yufei.conf.HelloAction">
			&lt;result name="success">/conf/welcome.jsp&lt;/result>
			&lt;result name="error">/conf/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
	 -->

	&lt;package name="yufei.conf.package" extends="struts-default">
		&lt;!-- 指定userMethod -->
		&lt;action name="Conf" class="yufei.conf.HelloAction" method="userMethod">
			&lt;result name="success">/conf/welcome.jsp&lt;/result>
			&lt;result name="error">/conf/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br /><br />我们再此启动tomcat,来测试,记住烦是修改了除页面文件以外的文件都需要重新启动tomcat或者<br />使用热部署重新部署一次<br />现在当我们在用户栏输入yufei后,不会进入welcome.jsp页面了,那证明没有调用execute方法,当在<br />用户栏输入featherfly后,进入了welcome.jsp页面,证明调用了userMethod方法<br />如果象下面这样只有name属性,会缺省使用com.opensymphony.xwork2.ActionSupport类,<br />调用其execute()方法,返回success<br /><pre name="code" class="java">
&lt;action name="Conf">
&lt;/action>
</pre><br /><br />-<br />-<br /><br />最后剩下result了,result是Action执行后返回的字符串<br /><br /><pre name="code" class="java">
&lt;result name="success">/conf/welcome.jsp&lt;/result>
&lt;result name="error">/conf/error.jsp&lt;/result>
</pre><br /><br />我之前都是这样写的,那是因为我都是使用我都是使用jsp作为其转向后的视图的,struts2支持<br />以多种视图显示(Jsp,FreeMaker,velocity等等),所以其基本形式和一些变型会在下面给出<br /><pre name="code" class="java">
	&lt;action name="referen" class="yufei.conf.HelloAction">
		&lt;!-- 基本形式 -->
		&lt;result name="success" type="dispatcher">
			&lt;param name="location">/conf/welcome.jsp&lt;/param>
		&lt;/result>
		&lt;!-- 
			如果location是唯一的参数,象上面这个,还可以改写为下面形式 
			如果result标签对中间没有 param 标签,就把result标签对中间
			的文本作为location
		-->
		&lt;result name="success" type="dispatcher">/conf/welcome.jsp&lt;/result>
		&lt;!-- 如果type是"dispatcher",类似于servlet标准中ServletDispatcher的forward-->
		&lt;result name="success">/conf/welcome.jsp&lt;/result>
		&lt;!-- 如果name是"success",还可以继续简化 -->
		&lt;result>/conf/welcome.jsp&lt;/result>
	&lt;/action>
</pre><br /><br />-<br />-<br /><br />有时候,我们会在很多不同页面的请求遇到某些情况都返回一个相同的页面(比如错误页面),那么我们在每一个<br />action里都要写出来,象下面那样<br /><br /><pre name="code" class="java">
&lt;package name="yufei.conf.package" extends="struts-default">
	&lt;!-- 在这个包下,两个action结果为error时,都会返回/conf/error.jsp -->
	&lt;action name="Conf" class="yufei.conf.HelloAction" method="userMethod">
		&lt;result name="success">/conf/welcome.jsp&lt;/result>
		&lt;result name="error">/conf/error.jsp&lt;/result>
	&lt;/action>
	&lt;action name="Hi" class="yufei.conf.Hi">
		&lt;result name="success">/conf/welcome1.jsp&lt;/result>
		&lt;result name="error">/conf/error.jsp&lt;/result>
	&lt;/action>
&lt;/package>
</pre><br /><br /><br />在这种情况下,我们就可以使用全局result,下面我们来看看其定义<br /><span style="color: red">Struts2 允许你为所有Action配置定义一些默认的result映射,它会自动的被这个包中的所有Action以及<br />扩展包继承,换句话说,如果你在多个Action中使用相同的result映射,你可以把它配置成全局的result</span><br />这里做个比喻,package就相当于java的类(class),全局result就相当于类中的成员变量,result就相当于成员方法,所有成员方法都能使用成员变量类可以继承其它类<br />下面我们来看实际例子,打开struts2.xml修改如下<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;!-- 
		这是上面配置的,现在将其注释起来,在复制一份,然后给其添加method属性
		由于刚才我们新建那个HelloAction类里除了execute()方法外,还有一个
		userMethod()方法
		要调用的方法必需符合以下三个条件
		1 是public 2 返回String 3 没有参数
	&lt;package name="yufei.conf.package" extends="struts-default">
		&lt;action name="Conf" class="yufei.conf.HelloAction">
			&lt;result name="success">/conf/welcome.jsp&lt;/result>
			&lt;result name="error">/conf/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
	 -->
	&lt;!--  把这里注释起来
	&lt;package name="yufei.conf.package" extends="struts-default">
		&lt;!-- 指定userMethod -->
		&lt;action name="Conf" class="yufei.conf.HelloAction" method="userMethod">
			&lt;result name="success">/conf/welcome.jsp&lt;/result>
			&lt;result name="error">/conf/error.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
	-->
	&lt;!-- 这里是新加的内容 -->
	&lt;package name="yufei.conf.package" extends="struts-default">
		&lt;!-- 
			这里声明了一个全局结果
			这就是代表,这个包下的所有action执行的返回结果是error
			就都会跳转到/conf/error.jsp
			继承此包的包的action也如此(当然在你覆盖了会是你覆盖后的配置)
		-->
		&lt;!-- ******************************************** -->
		&lt;global-results>
			&lt;result name="error">/conf/error.jsp&lt;/result>
		&lt;/global-results>
		&lt;!-- ******************************************** -->
		&lt;action name="Conf" class="yufei.conf.HelloAction" method="userMethod">
			&lt;result name="success">/conf/welcome.jsp&lt;/result>
		&lt;/action>
		&lt;action name="Hi" class="yufei.conf.Hi">
			&lt;result name="success">/conf/welcome1.jsp&lt;/result>			
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br />从上面的配置我们可以看出,这里多出了一个类(yufei.conf.Hi)和一个页面(/conf/welcome1.jsp)<br />yufei.conf.Hi 这个类的代码和 yufei.conf.HelloAction 完全一样,welcome1.jsp,只是多了点识别文本<br /><br /><pre name="code" class="java">
&lt;body>
    你好啊亲爱滴,我等你很久了
    此页在conf目录下&lt;br>
    这个页面是welcome1.jsp
    &lt;!--上面这个是识别文本,让我们看是跳转到welcome1还是welcome-->
&lt;/body>
</pre><br /><br /><br />最后需要在index.jsp里新加一个表单来让其跳转到Hi.action<br /><br /><pre name="code" class="java">
&lt;body>
	&lt;form action="Conf.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>    
    
    &lt;!-- 下面这个是新加的表单,提交到Hi.action -->
    &lt;form action="Hi.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>提交到Hi&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form> 
	&lt;/center>
&lt;/body>
</pre><br /><br /><br />现在我们可以打开tomcat,然后打开http://127.0.0.1:8888/Struts2Study/conf/index.jsp来测试了<br />当我们在上面和下面的表单里输入的不正确时,都时跳转到error.jsp,但是输入正确的话,上面的时跳转<br />到welcome.jsp(输入featherfly),下面是跳转到welcome1.jsp(输入yufei)<br /><br />-<br />-<br /><br />项目文件在附件中
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/124857#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Sep 2007 12:38:00 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/124857</link>
        <guid>http://yufei.javaeye.com/blog/124857</guid>
      </item>
      <item>
        <title>Struts 2 自学之路: 2 Struts2 基本流程</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/124800" style="color:red;">http://yufei.javaeye.com/blog/124800</a>&nbsp;
          发表时间: 2007年09月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容简介:了解Struts2 的基本流程<br /><br />说明: 此文只是我参看资料以及自己试验以后的观点<br /><br /><span style="color: red">此文的代码皆来自上篇文章中的项目,不过添加了些注释,毕竟流程还是看个程序怎么运行更直观<br />(我个人就觉得看程序怎么走,再看那些枯燥的说明让人更容易理解)</span><br /><br /><br /><br />首先我们来看struts2 在web.xml配置文件里配置的信息,这是我们使用struts2要做的第一步工作<br />文件中我们配置了一个过滤器,处理的类是org.apache.struts2.dispatcher.FilterDispatcher,从url-pattern可以看出,此应用程序的所有请求都会经过该过滤器<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app 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">	
    &lt;display-name>Struts 2.0 Hello World&lt;/display-name>
    &lt;filter>
        &lt;filter-name>struts2&lt;/filter-name>        
        &lt;filter-class>org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class>
    &lt;/filter>
    &lt;filter-mapping>
        &lt;filter-name>struts2&lt;/filter-name>
        &lt;url-pattern>/*&lt;/url-pattern>
    &lt;/filter-mapping>
&lt;/web-app>
</pre><br /><br /><br />接下来我们需要一个请求页面和两个分别表示成功和失败的页面<br />index.jsp,welcome.jsp,error.jsp<br />index.jsp代码如下,welcome.jsp和error.jsp由于只需要显示成功或失败的文字<br />这里就不在列出代码了<br /><br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>    
    &lt;title>第一个Struts程序&lt;/title>
  &lt;/head>
  
  &lt;body>
  	&lt;!-- form 表单提交给Login.action去处理 -->
	&lt;form action="Login.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
  &lt;/body>
&lt;/html>
</pre><br /><br /><br />然后我们需要处理action的类HelloAction<br />这个类只是个简单java类,没有继承任何类和实现任何接口<br /><br /><pre name="code" class="java">
package yufei.hello;

public class HelloAction
	{
	private String username;
	private String password;
	public String getPassword()
		{
		return password;
		}
	public void setPassword(String password)
		{
		this.password = password;
		}
	public String getUsername()
		{
		return username;
		}
	public void setUsername(String username)
		{
		this.username = username;
		}
	public String execute()
		{
		String strReturn = "error";
		if (username.equals("yufei"))
			strReturn = "success";
		return strReturn;
		}
	}
</pre><br /><br /><br />最后我们配置struts.xml<br /><br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;!--
		package 先不管,以后会讲,目前知道下面那些就够了
		name 属性任意填,只要不出现重复的就行,该属性必需有
		extends 属性 目前 记住一定要是"struts-default"这个
                               该属性必需有

	 -->
	&lt;package name="yufei.hello" extends="struts-default">
		&lt;!-- 
		 action 标签里 name属性代表我们要处理的.action的前面部分
		 		例如,这里的Login代表Login.action,可以打开项目里的index.jsp
		 		看表单的action属性,注意name的值是不带.action,只是前面部分
		 action 标签里 class属性代表我们需要哪个类来处理
		 result 标签的 name属性代表action类的执行方法的返回值,
		 		(即外层action标签里class属性那个类的),struts2中
		 		action类的默认执行方法是public String execute()
		        action类的执行方法一定要是public String 和 无参数
		        标签对中的属性代表,当execute方法返回的字符串和name里的
		        相同时就跳转到相应那页去,斜杠(/)是必需的
		 -->
		&lt;action name="Login" class="yufei.hello.HelloAction">
			&lt;result name="error">/error.jsp&lt;/result>
			&lt;result name="success">/welcome.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><br /><br />流程说明:<br />当我们运行程序在index.jsp页面中提交表单后,(实际上就是让页面跳转带着表单参数到相应的URL路径)表单里的action是Login.action,当我们提交表单实际就是将URL跳转到<br />http://127.0.0.1:8888/Struts2Study/Login.action这个路径上去<br />(http://127.0.0.1:8888/Struts2Study 这个为你的项目根路径)<br />由于我们在web.xml里面配置了过滤器,该过滤器在本应用程序的任何路径下都会执行,所以触发了FilterDispatcher来处理,然后该过滤器将以action结尾的请求转入Struts2框架处理。(struts2 配置文件中的默认后缀标记是action,当然你要喜欢也可以改为其它的,以后讲配置文件会提到)这里实际是截获了Login.action的请求,然后将.action的前面部分和struts.xml文件里的action的name对比,当找到相同的后,调用class属性里的类来处理,这里实际就是调用的yufei.hello.HelloAction(说明,当struts.xml里没有明确配置处理方法时,默认会去找execute方法来处理,而且处理的方法必需是公共(public) 返回字符串类型(String) 没有参数,关于方法配置在以后会提),最后根据action类的执行方法的返回值(String)来和struts.xml里面的该action配置下的result标签的name属性进行比对,然后进行相应的跳转<br />-<br />-<br />-<br />-<br />-<br />最后我将网上的关于Struts2 基本流程 比较理论化的说明放下面<br /><br /><br />--FilterDispatcher 是 Struts 2 框架的核心控制器，该控制器作为一个 Filter 运行在 Web应用中，它负责拦截所有的用户请求(拦截所有还是部分是由url-pattern来决定的)，当用户请求到达时，该 Filter 会过滤用户请求。如果用户请求以 action 结尾，该请求将被转入 Struts 2 框架处理。<br />--Struts 2 框架获得了*.action 请求后，将根据*.action请求的前面部分决定调用哪个业务逻辑组件，例如，对于 login.action 请求，Struts 2调用名为 login 的 Action来处理该请求。<br />--Struts 2 应用中的 Action都被定义在 struts.xml 文件中，在该文件中定义 Action 时，定义了该 Action 的name 属性和 class 属性，其中 name 属性决定了该 Action 处理哪个用户请求，而 class属性决定了该 Action 的实现类。 <br />--Struts 2 用于处理用户请求的 Action实例，并不是用户实现的业务控制器，而是 Action代理——因为用户实现的业务控制器并没有和 Servlet API耦合，显然无法处理用户请求。而 Struts 2 框架提供了系列拦截器，该系列拦截器负责将 HttpServletRequest 请求中的请求参数解析出来，传入到 Action 中，并回调 Action 的 execute方法来处理用户请求。<br />--显然，上面的处理过程是典型的 AOP（面向切面编程）处理方式。图 3.19 显示了这<br />种处理模型。 <br /><img src="http://yufei.javaeye.com/upload/picture/pic/5274/24c86b12-0d06-425e-bc4f-ad7397d67dde.jpg" /><br />--从图3.19中可以看出，用户实现的Action类仅仅是Struts 2的Action代理的代理目标。用户实现的业务控制器（Action）则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象里，而用户的 Action 类无需访问 HttpServletRequest 对象。拦截器负责将 HttpServletRequest里的请求数据解析出来，并传给业务逻辑组件 Action 实例<br /><br />-<br />-<br />-<br /><span style="color: red">最后发点牢骚,这篇文章写到1/3的时候保存到草稿箱,写完以后我保存到草稿箱,打开来看居然是1/3时候的样子...害我又重新写,吸取教训,下次写好了粘贴上来</span>
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/124800#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Sep 2007 21:12:00 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/124800</link>
        <guid>http://yufei.javaeye.com/blog/124800</guid>
      </item>
      <item>
        <title>Struts 2 自学之路: 1 准备工作及helloworld</title>
        <author>yufei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yufei.javaeye.com">yufei</a>&nbsp;
          链接：<a href="http://yufei.javaeye.com/blog/124610" style="color:red;">http://yufei.javaeye.com/blog/124610</a>&nbsp;
          发表时间: 2007年09月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容简介: <br /><br />本篇介绍如何在eclipse+myeclipse下搭建出使用struts2开发的环境<br /><br />以及带领你创建一个小程序(标题的helloword是用来表示第一个小程序)<br /><br /> <br /><br />1 搭建开发和运行环境<br /><br />java sdk(JDK) 1.5 以上 <br /><br />tomcat 5.5 以上 <br /><br />eclipse 3.2 以上<br /><br />myeclipse 5.0 以上<br /><br />struts2 的运行库(jar包)  在http://struts.apache.org/ 可以得到,<br /><br />我的环境是 jdk 1.5, tomcat 5.5 , eclipse 3.2.1 , myeclipse 5.1GA<br /><br />2 打开Eclipse选择新建项目,新建一个web project<br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5237/7a7b1995-3e13-431a-a04a-29f1209aed34.jpg" /><br /> <br /><br />选中Web Project 点下一步打开下面一个窗口 <br /><img src="http://yufei.javaeye.com/upload/picture/pic/5238/a3c727c0-46c0-4a80-9dec-cfc0dabc9168.jpg" /><br /> <br /><br />在Project Name 项键入 Struts2Study 点击完成 <br /><br />配置tomcat,按照图中提示进行 <br /><img src="http://yufei.javaeye.com/upload/picture/pic/5241/0bddfa1f-b824-4ecb-8349-d29dbb9eb792.jpg" /> <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5242/1a717247-a2e9-49d3-9cec-17263e9c6026.jpg" /><br /> <br /><br />然后布置项目到tomcat,按图提示操作 <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5239/4685b692-fa0a-442c-93cf-80ff4dcac4aa.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5243/e266c7ee-2758-4faf-88e8-04df0fed69d4.jpg" /> <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5244/c5dbd3cc-341f-4388-9d4f-99299db0f041.jpg" /><br /> <br /><br /><br />最后回到上面点add按钮那里,这时点完成 <br /><br />加入struts2的库(jar包)到构建路径 <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5249/e93ad1b4-518f-4f87-b693-a45f22ec8b68.jpg" /> <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5245/fd084d61-a2b7-42fc-82e5-a0d941f56091.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5246/6aeb08e7-b6d4-461d-8103-ba27c0847b39.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5247/87bc806c-3e60-45ed-b847-fb200ac34903.jpg" /> <br /><br /> <br /><br /><br />打开web.xml，修改其为以下代码 <br />web.xml 代码<pre name="code" class="java"> 
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app 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">	
    &lt;display-name>Struts 2.0 Hello World&lt;/display-name>
    &lt;filter>
        &lt;filter-name>struts2&lt;/filter-name>        
        &lt;filter-class>org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class>
    &lt;/filter>
    &lt;filter-mapping>
        &lt;filter-name>struts2&lt;/filter-name>
        &lt;url-pattern>/*&lt;/url-pattern>
    &lt;/filter-mapping>
&lt;/web-app>
</pre> <br /><br /><br />在scr目录下新建struts.xml <br />一定要在src目录下创建,原因以后会提 <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5251/17df285f-1116-4470-8a2e-6915a1dc7d69.jpg" /><br /><br /><br />在struts.xml中键入 <br />struts.xml 代码<pre name="code" class="java"> 
&lt;?xml version="1.0" encoding="GBK"?> 
&lt;!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"> 
&lt;struts> 
&lt;/struts> 
</pre> <br /><br />接下来新建一个jsp为index.jsp <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5252/bc854aa8-079e-468c-a9a0-85832e3990ea.jpg" /><br /><br />在jsp中编写一个标准的登录表单 <br />index.jsp 代码 <br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>    
    &lt;title>第一个Struts程序&lt;/title>
  &lt;/head>
  
  &lt;body>
	&lt;form action="Login.action" method="post">
    	&lt;table align="center">
    	&lt;caption>&lt;h3>用户登录&lt;/h3>&lt;/caption>
    		&lt;tr>
    			&lt;td>用户名:&lt;input type="text" name="username"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr>
    			&lt;td>密  码:&lt;input type="text" name="password"/>&lt;/td>
    		&lt;/tr>
    		&lt;tr align="center">
    			&lt;td colspan="2">&lt;input type="submit" value="登录"/>
    			&lt;input type="reset" value="重填"/>&lt;/td>
    		&lt;/tr>
    	&lt;/table>
    &lt;/form>
  &lt;/body>
&lt;/html>
</pre> <br /><br />接下来我们再新建两个jsp,一个为error.jsp,一个为welcome.jsp <br />error.jsp内只需要失败的文本,welcome.jsp只需要成功的文本 <br />welcome.jsp 代码<br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>    
    &lt;title>登录成功&lt;/title>
  &lt;/head>
  
  &lt;body>
    你好啊亲爱滴,我等你很久了
  &lt;/body>
&lt;/html>
</pre><br />error.jsp 代码<br /><pre name="code" class="java">
&lt;%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
    &lt;title>登录失败&lt;/title>
  &lt;/head>
  
  &lt;body>
    你是谁啊,我根本不认识你,再不离开我放狗了
  &lt;/body>
&lt;/html>
</pre><br /><br />恩,重点来了,接下来就是编写struts2的action和配置struts.xml文件了 <br />首先我们先建立一个java文件(新建->类) <br />如下图,包名yufei.hello,类名HelloAction <br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5253/034293d4-3f89-4af3-9b6e-fba62bd4774a.jpg" />  <br /><br /><br />HelloAction.java 代码<br /><pre name="code" class="java"> 
package yufei.hello;

public class HelloAction
	{
	private String username;
	private String password;
	public String getPassword()
		{
		return password;
		}
	public void setPassword(String password)
		{
		this.password = password;
		}
	public String getUsername()
		{
		return username;
		}
	public void setUsername(String username)
		{
		this.username = username;
		}
	public String execute()
		{
		String strReturn = "error";
		if (username.equals("yufei"))
			strReturn = "success";
		return strReturn;
		}
	}
</pre><br /><br />该类就是一个action,Struts 2.0的Action无须实现任何接口或继承任何类型 <br /><br />接下来修改struts.xml <br />struts.xml 代码 <br /><pre name="code" class="java"> 
&lt;?xml version="1.0" encoding="GBK"?>
&lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;!-- 这里是添加的内容 -->
	&lt;package name="yufei.hello" extends="struts-default">
		&lt;action name="Login" class="yufei.hello.HelloAction">
			&lt;result name="error">/error.jsp&lt;/result>
			&lt;result name="success">/welcome.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre> <br /><br />到目前为止,我们的第一个struts2的程序已经写完了,现在我们来启动tomcat来测试我们的程序了<br />图片中的端口是8888,而tomcat的默认端口是8080,如果你没有修改端口,请使用8080<br /> <br /><img src="http://yufei.javaeye.com/upload/picture/pic/5254/4045ebdb-248f-46fb-a969-4efac3acd191.jpg" /><br /> <br /><img src="http://yufei.javaeye.com/upload/picture/pic/5255/5d70e6c0-40e2-4a6f-83f7-50a6a16d14ca.jpg" /><br /><br /><img src="http://yufei.javaeye.com/upload/picture/pic/5256/32b73c42-922b-42d2-a1e2-2a846d8bdaa0.jpg" /><br /> <br /><br />在用户名中输入yufei以外的任何字符串或者不输入都会跳转到error.jsp<br /><br />这是因为我在execute方法里判断用户名时是yufei,返回的是字符串"success",而在struts.xml里配置的是跳转到welcome.jsp<br /><br />而此外的所有情况都是返回字符串"error",而在struts.xml里配置的是跳转到error.jsp<br />此篇文章项目文件在附件中<br /> <br /><br />关于action以及struts.xml的详细说明在以后的文章中<br /><br /> <br /><br />PS:<br /><br />写这么个简单得不能再简单的文章也居然用了我将近三个小时.....<br /><br />而且这文章结构还是我都已经想好的情况下现在我对那些在网上写教程的人更加感激了
          <br/>
          <span style="color:red;">
            <a href="http://yufei.javaeye.com/blog/124610#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Sep 2007 01:39:00 +0800</pubDate>
        <link>http://yufei.javaeye.com/blog/124610</link>
        <guid>http://yufei.javaeye.com/blog/124610</guid>
      </item>
  </channel>
</rss>