﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Love Pisces-文章分类-Struts学习日记</title><link>http://www.blogjava.net/supdreamer/category/22442.html</link><description>It's not your aptitude but your attitude that determines your altitude! </description><language>zh-cn</language><lastBuildDate>Tue, 05 Jun 2007 17:37:18 GMT</lastBuildDate><pubDate>Tue, 05 Jun 2007 17:37:18 GMT</pubDate><ttl>60</ttl><item><title>Struts应用之ActionForm</title><link>http://www.blogjava.net/supdreamer/articles/121818.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Mon, 04 Jun 2007 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/121818.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/121818.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/121818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/121818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/121818.html</trackback:ping><description><![CDATA[<p>Struts框架中的视图组件主要包括：<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;JSP页面<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;ActionForm类<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;Struts自定义标记<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;消息资源<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中，ActionForm类是Struts框架的核心组件之一，是Struts的关键视图组件。<br><br>1.ActionForm的作用机理<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm本质上是一种JavaBean，是专门用来传递数据的DTO(Data Transfer Object,数据传递对象)。它包括用于表单数据验证的validate()方法和用于数据复位的reset()方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts框架利用ActionForm对象来临时存放视图页面中的表单数据。例如一个登录页面会有一个用户输入框和一个密码输入框，以及用来提交登录请求的按钮。当用户提交登录请求后，Struts将用户名和密码两个输入域的数据自动填充到相应的ActionForm对象中，然后控制层可以从该ActionForm对象中读取用户输入的表单数据，也可以把来自模型层的数据存放到ActionForm中，然后返回给视图显示。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm有请求(request)和会话(session)两种作用域(scope)。如果ActionForm的作用域设定为request，ActionForm实例将保存在request对象中，像其他保存在request对象中的属性一样，仅在当前的请求/响应范围内有效。如果ActionForm的作用域设定为session，那么ActionForm实例将被保存在session对象中，同一个ActionForm实例在整个HTTP会话中有效。<br><br><img height=542 alt="" src="http://www.blogjava.net/images/blogjava_net/supdreamer/01.JPG" width=572 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当验证ActionForm时，如果检测到一个或多个验证错误，Struts框架会把错误转发回配置文件struts-config.xml中&lt;action&gt;元素的input属性所指定的输入页面。<br><br>2.ActionForm的使用方法<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)创建ActionForm<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以通过扩展Struts软件包的ActionForm类，来创建具体的ActionForm。Struts软件包中的ActionForm类本身是一个抽象类，在扩展该类时，为每一个要从HTML表单中捕获的输入域定义一个属性，使表单输入域与ActionForm的属性一一对应，以使ActionForm能够捕获需要的表单输入。定义了具体的属性，就可以覆写validate()和reset()方法，来实现具体的ActionForm验证规则和初始化方法。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)配置ActionForm<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每创建一个ActionForm类，就需要在Struts的配置文件struts-config.xml中配置这个类，例如：<br>&nbsp;&nbsp;&nbsp;&lt;form-beans&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean name="loginActionForm" type="login.loginActionForm" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/form-beans&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-beans&gt;元素用来指定全体ActionForm的配置，一个Struts应用所有的ActionForm的配置都要位于该元素标记内。&lt;form-beans&gt;元素的子元素&lt;form-bean&gt;用来配置一个具体的ActionForm类，每个&lt;form-bean&gt;元素对应的内容为一个form bean实例。一旦定义了&lt;form-beans&gt;元素，就可以在Action中使用它。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)访问ActionForm<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm可以被JSP，Struts自定义标记，Action或其他Web组件访问。访问ActionForm的一般方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;使用Struts HTML标记库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts HTML标记库提供了一组和ActionForm密切关联的标记，这些标记对应到HTML表单域。如&lt;html:form&gt;标记对应HTML的&lt;form&gt;标记，&lt;html:text&gt;标记对应HTML表单的text类型&lt;input&gt;输入域。这些标记和ActionForm交互，以把ActionForm中的属性值显示出来。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;从request或session对象中取出ActionForm对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据作用域的不同，Struts框架把ActionForm实例保存在request或session对象中，保存时采用的key值为&lt;form-bean&gt;元素的名字，即name属性的值。因此，可以像取出任何存放在request或session对象中的属性一样取出ActionForm实例。例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginActionForm form=(loginActionForm)request.getAttribute("loginActionForm");&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;在Action类的execute()方法中直接访问ActionForm<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果配置了ActionForm和Action映射，Struts框架就会把ActionForm作为参数传递给Action类的execute()方法，在execute()方法中，可以直接读取或设置ActionForm属性。<br></p>
<p>3.表单数据验证<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表单验证是ActionForm的主要功能之一，要实现这个功能，我们需要采取4个步骤：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;重写validate()方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;在资源文件ApplicationResources.properties中设置可能的验证错误的标识。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;要在配置文件struts-config.xml中，把&lt;action&gt;元素的validate属性设置为true，并添加&lt;message-resources&gt;元素以指明资源文件的存放路径。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;在相应输入页面的相应位置加如错误标记&lt;html:errors&gt;，以输出可能的验证错误。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)重写validate()方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对该form bean的validatet()方法进行重写。ActionErrors类封装了一组验证错误，它的用法类似Map类。而ActionMessage类封装了单个验证错误，它的构造函数内的参数就指向资源文件内的一个错误文本。例如语句&#8220;ActionMessage("login.password.error");&#8221;中的参数"login.password.error"其实就是资源文件ApplicationResources.properties中的一条错误文本的键(key)。通过ActionErrors对象的add()方法，可以把ActionMessage对象加入到ActionErrors对象中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)设置资源文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Struts的资源文件ApplicationResources.properties中设置可能的验证错误的标识：<br>#用户名错误<br>error.username.required=&lt;li&gt;Please input your username again!&lt;/li&gt;<br>#密码错误<br>error.password.required=&lt;li&gt;Please input your&nbsp;password again!&lt;/li&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)修改配置文件struts-config.xml<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将配置文件struts-config.xml中&lt;action&gt;元素的validate属性设定为true。此外，还需要增加&lt;message-resource&gt;元素，以指明资源文件的路径。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)在输入页面中加入错误标记<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表单数据验证的目的是，一旦用户在输入页面表单中输入的数据不符合要求或出现错误，Struts验证机制将把验证错误在该输入页面相应的位置显示出来。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:errors&gt;是Struts的一个自定义标记。它能根据它的property属性从资源文件ApplicationResources.properties中取出相应的验证错误，并在输入页面中指定的位置显示验证错误。<br></p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/121818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-06-04 13:47 <a href="http://www.blogjava.net/supdreamer/articles/121818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts详解之Action类</title><link>http://www.blogjava.net/supdreamer/articles/121482.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Sat, 02 Jun 2007 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/121482.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/121482.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/121482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/121482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/121482.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #ff0000">1.Action类<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.action.Action类是Struts的心脏，也是客户请求和业务操作间的桥梁。每个Action类通常涉及为代替客户完成某种操作。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一旦正确的Action实例确定，就会调用RequestProcessor类的processActionPerform()方法，processActionPerform()方法，负责调用Action实例的execute()方法。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execute()方法有4个参数：<span style="COLOR: #ff6600">ActionMapping</span>对象、<span style="COLOR: #ff6600">ActionForm</span>对象 、<span style="COLOR: #ff6600">HttpServletRequest</span>对象和<span style="COLOR: #ff6600">HttpServletResponse</span>对象。ActionForm对象封装了表单数据，因此Action类可以通过getter方法从该对象中获得表单数据，然后调用模型组件处理这些数据。Action类又通过ActionMapping对象的findForward()方法获得一个ActionForward对象，然后把处理结果转发到ActionForward对象所指的目标。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其具体的实现过程如下代码所示：<br>package login;<br>import org.apache.struts.action.*;<br>import javax.servlet.http.*;<br>import java.util.*;<br>&nbsp;<br>publlic class loginAction extends Action{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public ActionForward execute(ActionMapping actionmapping, ActionForm actionForm, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response )<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loginActionForm loginForm=(loginActionForm) actionForm;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">&nbsp;//从form bean中取出表单数据<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String username=loginForm.getUsername();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String password=loginForm.getPassword();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">//生成一个Session对象<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session=request.getSession(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.removeAttribute("username");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute("username",username);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">//生成一个ArrayList对象，并把用户名和密码的值寸入该对象中<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList arr=new ArrayList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr.add(username);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr.add(password);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String prompt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">//调用模型组件loginHandler，检查该用户是否已经注册<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginHandler login=new loginHandler();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean mark=login.checkLogin(arr);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mark)&nbsp; prompt="Success";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else prompt="Fail";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return actionMapping.findForward(prompt);<br>&nbsp;&nbsp; }<br>}<br></p>
<span style="COLOR: #ff0000">2.ActionMapping类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping存储了与特定用户请求对应的特定Action的相关信息，例如输入页面、转发页面等。ActionServlet将ActionMapping传送到Action类的execute()方法，然后Action将调用ActionMapping的findForward()方法，此方法返回一个指定名称的ActionForward，这样Action就完成了本地转发。若没有找到具体的ActionForward，就返回一个null。<br><br><span style="COLOR: #ff0000">3.ActionForward类</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action类中的execute()方法返回一个ActionForward对象。ActionForward对象代表一个Web资源的逻辑抽象表示形式。这里的Web资源通常就是JSP页面或Java Servlet。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForward是该资源的包装类，所以应用程序和实际资源之间并无多少瓜葛。实际的Web资源只在配置文件struts-config.xml中指定（如forward元素的name，path和redirect属性），并非在程序代码中写入。RequestDispatch会根据redirect属性的值，来决定ActionForward实例要进行转发还是重定向。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要从一个Action实例返回一个ActionForward实例，可以在Action类内动态地创建一个ActionForward实例，或者更常见的做法是使用ActionMapping的findForward()方法找出配置文件中预先配置的一个ActionForward实例，如下所示：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return mapping.findForward("Success");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中，mapping是一个ActionMapping实例，该程序片断能够返回一个参数&#8220;Success&#8221;对应的ActionForward实例，以下代码是在配置文件struts-config.xml中定义的forward元素：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action name="loginActionForm" type="login.loginAction"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validate="false" input="/login.jsp"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope="request" path="/loginAction"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward name="Success" path="/main.jsp" redirect="true"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward name="Fail" path="/register.jsp" redirect="true"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping类的findForward()方法首先会调用findForwardConfig()方法，以查看在&lt;action&gt;元素中是否包含&lt;forward&gt;子元素，如果有，就会检查&lt;global-forwards&gt;元素片段。一旦找到匹配的ActionForward实例，就会从execute()方法将其返回给RequestProcessor。下面是ActionMapping类的findForward()方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public ActionForward findForward(String name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForwardConfig config=findForwardConfig(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(config==null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config=getModuleConfig().findForwardConfig(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ( (ActionForward) &nbsp;config );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src ="http://www.blogjava.net/supdreamer/aggbug/121482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-06-02 13:44 <a href="http://www.blogjava.net/supdreamer/articles/121482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts详解之struts-config.xml</title><link>http://www.blogjava.net/supdreamer/articles/121460.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Sat, 02 Jun 2007 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/121460.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/121460.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/121460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/121460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/121460.html</trackback:ping><description><![CDATA[<p dir=ltr style="MARGIN-RIGHT: 0px"><span style="COLOR: red">Struts配置文件struts-config.xml</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该文件可配置各种组件，包括 form bean，Actions，ActionMappings，全局转发GlobalForwards，数据源DataSource及插件Plugins。<br>例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;struts-config&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-beans&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean name="loginAction" type="login.loginActionForm" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form-beans&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action-mappings&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action name="loginActionForm" type="login.loginAction"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validate="false" input="/login.jsp"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope="request" path="/loginAction" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward name="Success" path="/main.jsp"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward name="Fail" path="/register.jsp"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action-mappings&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/struts-config&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在此例中，根元素是&lt;struts-config&gt;，它包含两个主要的元素&lt;form-beans&gt;和&lt;action-mappings&gt;，分别描述了系统中的ActionForm对象和Action对象。<br><br><span style="COLOR: red">struts-config.xml的主要元素及作用如下：<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;struts-config&gt;：根元素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;form-beans&gt;：描述一组ActionForm对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;action-mappings&gt;：描述一组Action对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;global-forwards&gt;：定义在整个应用程序内可见的全局转发<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;data-source&gt;：定义数据源<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;global-exception&gt;：定义全局异常<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;controller&gt;：用于配置控制类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;message-resources&gt;：用于配置消息资源包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;plug-in&gt;：用于定义添加至Struts应用中的插件</p>
<p style="COLOR: red">1.&lt;form-beans&gt;元素(用于描述ActionForm对象)<br><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-beans&gt;元素允许配置多个ActionForm类。它可包含零个或多个&lt;form-bean&gt;子元素。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean&gt;元素的主要属性如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;className：可选，指定和&lt;form-bean&gt;元素对应的配置类，默认值为org.apache.struts.config.FormBeanConfig，自定义的配置类必须扩展该类。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;name：指定该ActionForm的唯一标识，Struts框架用该标识来引用这个form bean，该属性必须指定。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;type：指定ActionForm的完整类路径和类名，该属性必须指定。<br></span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果配置了动态ActionForm(DynaActionForm)，则还必须配置&lt;form-bean&gt;元素的&lt;form-property&gt;子元素，用来指定表单字段。<br><br></span>2.&lt;action-mappings&gt;元素(用于描述Action对象)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #000000">&nbsp;&lt;action-mappings&gt;元素帮助进行框架内部的流程控制，可将请求URI映射到Action类，将Action对象与ActionForm对象相关联。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action-mappings&gt;元素内可以定义多个&lt;action&gt;子元素。&lt;action&gt;元素所描述的是特定的请求路径和一个相应Action类之间的映射关系。Struts控制器会将请求中的URI路径与诸多&lt;action&gt;元素中的path属性相匹配，以选出一个特定的映射。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style="COLOR: #000000"><font style="COLOR: #000000" color=#ff0000>action-mappings</font>&gt;元素的主要</span>属性如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;attribute：设置和Action关联的forn bean在request/session内的属性key，通过request/session的getAttribute(attribute)方法返回该form bean的实例。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;name：指定同该Action关联的form bean的引用标识。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;type：指定该Action类的完整类路径和类名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;validate：指定是否调用form bean的validate()方法验证表单的数据，默认为true。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;input：指定表单输出页面的URL路径，当表单验证失败时将请求转发到该URL。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;scope：指定同该Action类关联的forn bean的存在范围，可选request和session，默认为session。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;path：指定Action的访问路径，即该Action在引用中的标识名，以&#8220;/&#8221;开头。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&gt;元素中可包含零个或多个&lt;forward&gt;子元素，&lt;forward&gt;子元素定义了转发动作，它的主要属性如下所示：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;name：指定转向标识名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;path：指定转向标识名所对应的转向页面。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;redirect：指定是转发还是重定向。<br><br><span style="COLOR: #ff0000">3.&lt;global-forwardvs&gt;元素<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;global-forwards&gt;元素用来定义在整个应用程序内的全局转发，在该元素内可以定义多个&lt;forward&gt;子元素。例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;global-forwards&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward name="Success" path="/main.jsp"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward name="Fail" path="/register.jsp"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/global-forwards&gt;<br><br><span style="COLOR: red">4.&lt;message-resources&gt;元素</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;message-resources&gt;元素用于配置消息资源文件(Resource Bundle),以在应用的客户端界面中输出本地化消息文本。例</span><span style="COLOR: #000000">如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mesasge-resources key="application" parameter="ApplicationResources"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该语句指定了一个叫ApplicationResources.properties的消息资源文件或属性文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;message-resources&gt;元素的属性如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;className：指定和&lt;form-bean&gt;元素对应的配置类,默认值为</span><span style="COLOR: #000000">org.apache.struts.config.MessageResourcesConfig<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;factory：指定消息资源的工厂类，默认为org.apache.struts.uitl.PropertyMessageResourcesFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;key：指定资源文件存放在ServletContext对象中时使用的属性key,默认值为Globals.MESSAGE_KEY定义的字</span><span style="COLOR: #000000">符串常量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;null：指定MessageResources对未知消息的处理方式，若为true将返回空字符串，若为false则返回类似</span><span style="COLOR: #000000">&#8220;???global.label.missing???&#8221;的字符串，默认值为true。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;parameter：指定消息资源文件存放的路径。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/121460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-06-02 10:15 <a href="http://www.blogjava.net/supdreamer/articles/121460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Struts框架的JSP文件的特点</title><link>http://www.blogjava.net/supdreamer/articles/121392.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Fri, 01 Jun 2007 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/121392.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/121392.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/121392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/121392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/121392.html</trackback:ping><description><![CDATA[<p>基于Struts框架的JSP文件有以下特点：<br>&nbsp;&nbsp;&nbsp;1.没有任何Java程序代码。<br>&nbsp;&nbsp;&nbsp;2.使用了许多Struts的客户化标签，例如：&lt;html:form&gt;和&lt;logic:present&gt;标签。<br>&nbsp;&nbsp;&nbsp;3.没有直接提供文本内容，取而代之的是&lt;bean:message&gt;标签，输出到网页上的文本内容都是由&lt;bean:message&gt;标签来生成的。例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:message key="hello.jsp.prompt.person"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts客户化标签是联系视图组件和Struts框架中其他组件的纽带。这些标签可以访问或显示来自于控制器和模型组件的数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSP文件开头几行用于声明和加载Struts标签库：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上代码表明该JSP文件使用了Struts Bean、Html和Logic标签库，这是加载客户化标签库的标准JSP语法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;html:errors&gt;：用于显示Struts框架中其他组件产生的错误消息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;html:form&gt;：用于创建HTML表单，它能够把HTML表单的字段和ActionForm Bean的属性关联起来。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;html:text&gt;：该标签是&lt;html:form&gt;的子标签，用于创建HTML表单的文本框。它和ActionForm </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bean的属性相关联。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;bean:message&gt;：用于输出本地化的文本内容，它的key属性指定消息key，与消息key匹配的文本内容来自于专门的Resource Bundle。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;bean:write&gt;：用于输出JavaBean的属性值。例如，&lt;bean:write name="personbean" property="userName"/&gt;，它用于输出personbean对象的userName属性值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;&lt;logic:present&gt;：用来判断JavaBean在特定的范围内是否存在，只有当JavaBean存在时，才会执行标签主体中的内容,例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic"present name="personbean" scope="request"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello &lt;bean:write name="personbean" property="userName"/&gt;!&lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/h2&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:present&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:present&gt;标签用来判断在request范围内是否存在personBean对象，如果存在，就输出personBean的userName属性值。与&lt;logic:present&gt;标签相对的是&lt;logic:notPresent&gt;标签，它表示只有当JavaBean在特定的范围内部存在时，才会执行标签能主体中的内容。</p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/121392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-06-01 17:30 <a href="http://www.blogjava.net/supdreamer/articles/121392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts应用：helloapp</title><link>http://www.blogjava.net/supdreamer/articles/121324.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Fri, 01 Jun 2007 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/121324.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/121324.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/121324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/121324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/121324.html</trackback:ping><description><![CDATA[<p>1.分析helloapp应用的需求&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;接受用户输入的姓名&lt;userName&gt;,然后返回字符串"Hello&lt;userName&gt;!"。<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;如果用户没有输入姓名就提交表单，将返回出错信息，提示用户首先输入姓名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;如果用户输入姓名为"Monster"，将返回出错信息，拒绝向"Monster"打招呼。<br></p>
<p><br>2. 运用Struts框架&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;模型包括一个JavaBean组件PersonBean，它有一个userName属性，代表用户输入的名字。它提供了get/set方法，分别用于读取和设置userName属性，它还提供一个save()方法，负责把userName属性保存到持久化存储系统中，如数据库或文件系统。对于更为复杂的Web应用，JavaBean组件可以作为EJB或Web服务的前端组件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;视图包括一个JSP文件hello.jsp，它提供用户界面，接受用户输入的姓名。视图还包括一个ActionForm Bean，它用来存放表单数据，并进行表单验证，如果用户没有输入姓名就提交表单，将返回出错信息。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;控制器包括一个Action类HelloAction，它完成三项任务：1．进行业务逻辑验证，如果用户输入的姓名为"Monster", 将返回错误消息；2．调用模型组件PersonBean的save()方法，保存用户输入的名字；3．决定将合适的视图组件返回给用户。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;除了创建模型、视图和控制器组件，还需要创建Struts的配置文件struts-config.xml，它可以把这些组件组装起来，使它们协调工作。此外，还需要创建整个Web应用的配置文件web.xml。 <br><br>3.创建视图组件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本例中，视图包括两个组件：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;一个JSP文件：hello.jsp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;一个ActionForm Bean： HelloForm Bean (HelloForm.java)。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中，jsp中有代码&lt;html:bean action="/HelloWorld" focus="userName"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用户提交了HTML表单后，Struts框架将自动把表单数据组装到ActionForm Bean中。ActionForm Bean中的属性和HTML表单中的字段一一对应。ActionForm Bean还提供了数据验证方法，以及把属性重新设置为默认值的方法。Struts框架中定义的ActionForm类是抽象的，必须在应用中创建它的子类，来存放具体的HTML表单数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloForm.java中有两个特殊的方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;validate()：用于表单验证。<br>&nbsp;&nbsp;&nbsp;&nbsp;&#183;reset()：把属性重新设置为默认值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本例中的资源文件是application.properties，用来存放数据信息。<br><br>4.创建控制器组件：HelloAction.java&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;控制器组件包括ActionServlet类和Action类。ActionServlet类是Struts框架自带的，它是整个Struts框架的控制枢纽，通常不需要扩展。Struts框架提供了可供扩展的Action类，它用来处理特定的HTTP请求。<br>&nbsp;所有的Action类都是org.apache.struts.action.Action的子类，Action子类应该覆盖父类的execute()方法。<br><span style="COLOR: red">HelloAction.java的代码如下：</span></p>
<p>package hello;</p>
<p>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.struts.action.Action;<br>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionForward;<br>import org.apache.struts.action.ActionMapping;<br>import org.apache.struts.action.ActionMessage;<br>import org.apache.struts.action.ActionMessages;<br>import org.apache.struts.util.MessageResources;</p>
<p>import com.yourcompany.struts.PersonBean;<br>import com.yourcompany.struts.form.HelloForm;<br><span style="COLOR: #339966">/**&nbsp;<br>&nbsp;* @struts.action path="/hello" name="helloForm" input="/form/hello.jsp" scope="request" validate="true"<br>&nbsp;*/<br></span>public final class HelloAction extends Action {</p>
<p>&nbsp;<span style="COLOR: #339966">/** <br>&nbsp; * Method execute<br>&nbsp; * @param mapping:ActionMapping包含了这个Action的配置信息和Struts-config.xml文件中的&lt;action&gt;元素对应。<br>&nbsp; * @param form:ActionForm包含了用户的表单数据，当Struts框架调用execute()方法时，ActionForm中的数据<br>&nbsp;&nbsp;*已经通过了表单验证。<br>&nbsp; * @param request:HttpServletRequest当前的HTTP请求对象<br>&nbsp; * @param response:HttpServletResponse当前的HTTP响应对象<br>&nbsp; * @return ActionForward<br>&nbsp; */<br></span>&nbsp;public ActionForward execute(<br>&nbsp;&nbsp;ActionMapping mapping,<br>&nbsp;&nbsp;ActionForm form,<br>&nbsp;&nbsp;HttpServletRequest request,<br>&nbsp;&nbsp;HttpServletResponse response) throws Exception{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;<span style="COLOR: #339966">/* These "massage come from the ApplicationResources.properties file"<br>&nbsp;&nbsp; * getResources(HttpServletRequest request)方法返回当前默认的MessageResource对象，它封装了Resource <br>&nbsp;&nbsp; *Bundle 中的文本内容。&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;* 接下来Action类就可以通过MessageResource对象来访问文本内容。例如：如果要读取消息key&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; *为"hello.jsp.title"对应的文本内容,可以调用MessageResources类的getMessage(String key)方法:<br>&nbsp;&nbsp; *String title=messages.getMessage("hello.jsp.title");<br>&nbsp;&nbsp; * MessageResources messages=getResources(request);<br>&nbsp;&nbsp; */<br>&nbsp;&nbsp;/*<br>&nbsp;&nbsp; * Validate the request parameters specified by the user<br>&nbsp;&nbsp; * Note: Basic field validation done in&nbsp; HelloForm.java<br>&nbsp;&nbsp; *&nbsp;Business logic validation done in HelloAction.java<br>&nbsp;&nbsp; * 如果用户输入的姓名为"Monster"，将创建包含错误信息的AcrionMessage对象，ActionMessage对象被保存<br>&nbsp;&nbsp; *到ActionMessages对象中。接下来调用在Action基类中定义的saveErrors()方法，它负责把ActionMessages<br>&nbsp;&nbsp; *对象保存到request范围内。最后返回ActionForward对象，Struts框架会根据ActionForward对象包含的转发<br>&nbsp;&nbsp; *信息把请求转发到恰当的视图组件，视图组件通过&lt;html:errors&gt;标签把request范围内的ActionMessages对象<br>&nbsp;&nbsp; *中包含的错误消息显示出来，提示用户修改错误。&nbsp;&nbsp; <br>&nbsp;&nbsp; * */<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMessages errors=new ActionMessages();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String userName=(String)((HelloForm) form).getUserName();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String badUserName="Monster";<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(userName.equalsIgnoreCase(badUserName))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">//equalsIgnoreCase方法同vequals，只不过equalsIgnoreCase 是忽略大小写。<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors.add("username",new ActionMessage("hello.dont.talk.to.monster",badUserName));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveErrors(request,errors);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (new ActionForward(mapping.getInput()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<span style="COLOR: #339966">&nbsp;/*<br>&nbsp;&nbsp; * HelloAction类创建了一个模型组件PersonBean对象，并调用它的saveToPersistentStore()方法来保存userName<br>&nbsp;&nbsp;&nbsp;*属性。<br>&nbsp;&nbsp; * from the View,we now update the model<br>&nbsp;&nbsp; * <br>&nbsp;&nbsp; * */<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PersonBean pb=new PersonBean();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb.setUserName(userName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb.saveToPersistentStore();<br>&nbsp;&nbsp;<span style="COLOR: #339966">/*<br>&nbsp;&nbsp; * 把PersonBean对象保存在request范围内内<br>&nbsp;&nbsp; * 从request范围内删除ActionForm Bean。由于后续的请求转发目标组件不再需要HelloForm Bean，所以<br>&nbsp;&nbsp; *可将它删除。当HelloAction类调用HttpServletRequest的setAttribute()方法，向hello.jsp传递PersonBean对象时，<br>&nbsp;&nbsp; *需要提供一个名为&#8220;persinbean&#8221;的属性key:request..setAttribute("personbean",pb);<br>&nbsp;&nbsp; * hello.jsp通过这个名为"personbean"的属性来读取PersonBean对象：<br>&nbsp;&nbsp; * &lt;login:present name="personbean" scope="request"&gt;<br>&nbsp;&nbsp; * &lt;h2&gt;Hello &lt;bean:write name="personbean" property="userName"/&gt;!&lt;/h2&gt;<br>&nbsp;&nbsp; * &lt;/logic:persent&gt;<br>&nbsp;&nbsp; * 对于Struts应用，提倡将这些属性key常量定义在一个Java文件Constant.java中，例如本例。<br>&nbsp;&nbsp; * */<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(com.yourcompany.struts.Constants.PERSON_KEY,pb);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.removeAttribute(mapping.getAttribute());<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (mapping.findForward("SayHello"));<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>5.创建模型组件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本例的模型组件是PersonBean.java，PersonBean是一个非常简单的JavaBean，它包括一个userName属性，以及相关的get/set方法。此外，它还有一个业务方法saveToPersistentStore()。<br><br>6. 创建存放常量的Java文件：Constant.java<br><br>7.创建配置文件web.xml和struts-config.xml</p>
<p><span style="COLOR: red">本例的运行流程为：</span></p>
<p>1.Servlet容器在web.xml文件中寻找&lt;url-pattern&gt;属性为"*.do"的&lt;servlet-mapping&gt;元素：<br>&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br><br>2.Servlet容器依据以上&lt;servlet-mapping&gt;元素的&lt;servlet-name&gt;属性"action"，在web.xml文件中寻找匹配的&lt;servlet&gt;元素：<br>&nbsp;&nbsp;&nbsp;&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br><br>3.Servlet容器把请求转发给以上&lt;servlet&gt;元素指定的ActionServlet，ActionServlet依据用户请求路径"/HelloWorld"，在Struts配置文件中检索path属性为"/HelloWorld"的Action元素：<br>&nbsp;&nbsp;&nbsp;&lt;action<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path="/HelloWorld"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="hello.HelloAction"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="HelloForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attribute="inputForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope="request"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validate="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;input="/hello.jsp"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="SayHello" path="/hello.jsp" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br><br>4.ActionServlet根据&lt;action&gt;元素的name属性，创建一个HelloForm对象，把客户提交的表单数据传给HelloForm对象，再把HelloForm对象保存在&lt;action&gt;元素的scope属性指定的request范围内。<br><br>5.由于&lt;action&gt;元素的validate属性为true，ActionServlet调用HelloForm对象的validate()方法执行表单验证。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;当文本框中不输入姓名的时候,vallidate()方法返回一个ActionErrors对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionServlet把HelloForm的validate()方法返回的ActionErrors对象保存在request范围内,然后根据&lt;action&gt;元素的input属性,把客户请求转发给hello.jsp。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;当文本框中输入姓名"Monster"的时候,vallidate()方法返回ActionErrors对象中不包含任何ActionMessage对象,表示表单验证成功。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionServlet查找HelloAction实例是否存在，如果不存在就创建一个实例，然后调用HelloAction的execute()方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloAction的execute()方法先进行逻辑验证，由于没有通过逻辑验证，就创建一个ActionMessage对象，这个ActionMessage对象封装了错误消息，execute()方法把ActionMessage对象保存在ActionMessages对象中，再把ActionMessages对象存放在request范围内。最后返回一个ActionForward对象，该对象包含的请求转发路径为&lt;action&gt;元素的input属性指定的hello.jsp。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#183;当文本框中输入其他姓名的时候,vallidate()方法返回ActionErrors对象中不包含任何ActionMessage对象,表示表单验证成功。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloAction的execute()方法进行逻辑验证，这次通过了验证，然后执行相关的业务逻辑，最后调用ActionMapping.findForward()方法，参数为&#8220;SayHello&#8221;:return (mapping.findForward("SayHello"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping.findForward()方法从&lt;action&gt;元素中寻找name属性为&#8220;SayHello&#8221;的&lt;forward&gt;子元素，然后返回与之对应的ActionForward对象，它代表的请求转发路径为&#8220;/hello.jsp&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloAction的execute()方法把ActionForward对象返回给ActionServlet，ActionServlet再把客户请求转发给hello.jsp。<br>&nbsp;hello.jsp的&lt;bean:message&gt;标签从Resource Bundle中读取文本，把它们输出到网页上，最后生成动态网页。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/121324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-06-01 11:16 <a href="http://www.blogjava.net/supdreamer/articles/121324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建一个简单的基于MVC模式的Java Web应用程序</title><link>http://www.blogjava.net/supdreamer/articles/118635.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Sun, 27 May 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/118635.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/118635.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/118635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/118635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/118635.html</trackback:ping><description><![CDATA[<p style="COLOR: #000000">例1-4</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用JSP、Servlet及JavaBeans构建一个简单的登陆系统。该系统的要求是，当用户在登陆录页面上填写用户名和密码并提交之后，系统将检查该用户是否已经注册；如果该用户已经注册，系统将进入主页面，否则就进入注册页面。我们将按照以下步骤构建这个系统：</p>
<p style="COLOR: #000000">1.数据库设计：使用MS Access作为数据库，构建数据表T_UserInfo;</p>
<p style="COLOR: #000000">2.构建视图组件：登录页面login.jsp，主页面main.jsp，以及注册页面register.jsp；</p>
<p style="COLOR: #000000">3.构建控制层组件：一个Servlet,取名为loginServlet.java;</p>
<p style="COLOR: #000000">4.构建业务逻辑层组件（Model组件）：一个JavaBean，取名为loginHandler.java；</p>
<p style="COLOR: #000000">5.构建数据访问层组件：一个数据访问类，取名为dbPool,java;</p>
<p style="COLOR: #000000">6.编译、打包程序；</p>
<p style="COLOR: #000000">7.部署该程序到Web服务器Tomcat中，然后运行。</p>
<p style="COLOR: #000000">该系统的工作流程如图：<br>
<div style="COLOR: #000000" align=center src_cetemp="/images/blogjava_net/supdreamer/ex1.JPG"><img height=250 alt="" src="http://www.blogjava.net/images/blogjava_net/supdreamer/ex1.JPG" width=433 align=left border=0></div>
<p style="COLOR: #000000">&nbsp;</p>
<br><br><br><br><br><br><br><br><br><br><br><br>&nbsp;
<p style="COLOR: #000000">1.数据库设计</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户登录是一个涉及数据库操作的用例。登录涉及的数据表名为test，结构如下：</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;字段名：username&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;字段类型：nvarchar(50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段描述：用户名，主键</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;字段名：password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段类型：nvarchar(50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段描述：密码</p>
<p style="COLOR: #000000">2.构建视图组件</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本例有3个视图组件，分别是登录页面login.jsp，主页面main.jsp及注册页面register.jsp。它们之间的关系是，当用户在登录页面login.jsp填上用户名和密码后并提交后，系统将检查用户是否已经注册，如果该用户已经注册，系统将进入主页面main.jsp，否则就进入注册页面register.jsp。</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用户按下login.jsp页面上的&#8220;登录&#8221;按钮后，系统就把请求传给一个叫做loginServlet的Servlet。以做进一步处理。<br></p>
<p style="COLOR: #000000"><span style="COLOR: #ff00ff">login.jsp:</span><br><br>&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;</p>
<p style="COLOR: #000000">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br>&lt;html&gt;&nbsp;&nbsp;<br>&nbsp; &lt;body&gt;<br>&nbsp;&nbsp;&lt;FORM name="form" action="loginservlet" method="get"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;P&gt;&amp;nbsp;&amp;nbsp; 用户名:<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;INPUT type="text" name="username" size="15"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/P&gt;&lt;P&gt;&nbsp; &amp;nbsp;&amp;nbsp; 密&amp;nbsp; 码: &lt;INPUT type="password" name="password" size="15"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/P&gt;&lt;P&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;INPUT type="submit" name="submit" value="登录"&gt;&lt;/P&gt;&lt;P&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/P&gt;<br>&nbsp;&nbsp;&lt;/FORM&gt;<br>&nbsp;&lt;/body&gt;<br>&lt;/html&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用户登录成功后，系统转入main.jsp，告诉用户已经登录成功，现已进入主页面。<br><br><span style="COLOR: #ff00ff">main.jsp:</span><br><br>&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;<br>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br>&lt;html&gt;<br>&nbsp; &lt;head&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; &lt;title&gt;My JSP 'main.jsp' starting page&lt;/title&gt;<br>&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="pragma" content="no-cache"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="expires" content="0"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="description" content="This is my page"&gt;<br>&nbsp; &nbsp; &lt;/head&gt;&nbsp;<br>&nbsp; &lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;h1&gt;<br>&nbsp;&nbsp;&nbsp; &lt;%=session.getAttribute("username")%&gt;，你成功登录，现已进入主页面！<br>&nbsp;&nbsp;&nbsp; &lt;/h1&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用户登录失败后，系统转入register.jsp，告诉用户登录失败，现已进入注册页面，请注册用户信息。<br><br><span style="COLOR: #ff00ff">register.jsp:</span><br><br>&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;<br>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br>&lt;html&gt;<br>&nbsp; &lt;head&gt;<br>&nbsp; &lt;title&gt;My JSP 'register.jsp' starting page&lt;/title&gt;&nbsp;&nbsp;&nbsp;<br>&nbsp; &lt;/head&gt;&nbsp;<br>&nbsp; &lt;body&gt;<br>&nbsp; &lt;H1&gt;<br>&nbsp;&nbsp;&nbsp; &lt;%=session.getAttribute("username")%&gt;，你未能成功登录，现进入注册页面，请注册你的信息！<br>&nbsp; &lt;/H1&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本例的控制器组件是一个Servlet，叫做loginServlet，该组件先处理HTTP POST请求，然后调用模型组件或业务逻辑组件loginHandler检查该用户是否已注册，如果已注册，系统转入主页面main.jsp，否则进入注册页面register.jsp，要求用户注册自己的信息。另外，Servlet都要在web.xml中声明。<br><br><span style="COLOR: #ff00ff">loginServlet.java:</span><br><br>package chap1;</p>
<p style="COLOR: #000000">import javax.servlet.*;<br>import javax.servlet.http.*;<br>import java.io.*;<br>import java.util.*;</p>
<p style="COLOR: #000000">public class LoginServlet extends HttpServlet{<br>&nbsp;private static final long serialVersionUID = 2674925070582791853L;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966"> <br>&nbsp;//初始化Servlet<br></span>&nbsp;public void init() throws ServletException{</p>
<p style="COLOR: #000000">&nbsp;}<br>&nbsp;<span style="COLOR: #339966">//处理HTTP POST请求<br></span>&nbsp;public void doPost(HttpServletRequest request,HttpServletResponse response)<br>&nbsp;&nbsp;throws ServletException,IOException{<br>&nbsp;<span style="COLOR: #339966">&nbsp;//从请求中取出用户名和密码的值<br></span>&nbsp;&nbsp;String username=request.getParameter("username");<br>&nbsp;&nbsp;String password=request.getParameter("password");&nbsp;&nbsp;<br>&nbsp;&nbsp;<span style="COLOR: #339966">//生成一个ArrayList对象，并把用户名和密码的值存入该对象中<br></span>&nbsp;&nbsp;ArrayList arr=new ArrayList();<br>&nbsp;&nbsp;arr.add(username);<br>&nbsp;&nbsp;arr.add(password);<br>&nbsp;&nbsp;<span style="COLOR: #339966">//生成一个Session对象</span><br>&nbsp;&nbsp;HttpSession session=request.getSession(true);<br>&nbsp;&nbsp;session.removeAttribute("username");<br>&nbsp;&nbsp;session.setAttribute("username",username);<br>&nbsp;&nbsp;<span style="COLOR: #339966">//调用模型组件loginHandler,检查该用户是否已注册<br></span>&nbsp;&nbsp;LoginHandler login=new LoginHandler();<br>&nbsp;&nbsp;boolean mark=login.checkLogin(arr);&nbsp;<br>&nbsp;<span style="COLOR: #339966">&nbsp;//如果已经注册，进入主页面<br></span>&nbsp;&nbsp;if(mark) response.sendRedirect("main.jsp");<br>&nbsp;&nbsp;<span style="COLOR: #339966">//如果未注册，进入注册页面<br></span>&nbsp;&nbsp;else response.sendRedirect("register.jsp");<br>&nbsp;}<br>&nbsp;<span style="COLOR: #339966">//处理HTTP GET请求<br></span>&nbsp;public void doGet(HttpServletRequest request,HttpServletResponse response)<br>&nbsp;throws ServletException,IOException{<br>&nbsp;&nbsp;doPost(request,response);<br>&nbsp;}<br>&nbsp;<span style="COLOR: #339966">//销毁Servlet<br></span>&nbsp;public void destroy(){&nbsp;<br>&nbsp;}<br>}<br><br><span style="COLOR: #ff00ff">web.xml:</span><br><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;web-app version="2.4" xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" <br>&nbsp;xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>"&gt;<br>&lt;servlet&gt;<br>&lt;servlet-name&gt;loginservlet&lt;/servlet-name&gt;<br>&lt;servlet-class&gt;chap1.LoginServlet&lt;/servlet-class&gt;<br>&lt;/servlet&gt;<br>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;loginservlet&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;/loginservlet&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>&lt;/web-app&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本例的模型组件（或称为业务逻辑组件）是loginHandler，它先从数据访问组件dbPool取得数据库连接，然后检查数据库中是否已有该用户的记录，即检查还用户是否已经注册。如果已注册，返回true，否则返回false。<br><br><span style="COLOR: #ff00ff">loginHandler.java:</span><br><br>package chap1;</p>
<p style="COLOR: #000000">import java.sql.*;<br>import java.util.*;</p>
<p style="COLOR: #000000">public class LoginHandler {<br>&nbsp;<br>&nbsp;public LoginHandler() { }<br>&nbsp;<br>&nbsp;Connection conn;<br>&nbsp;PreparedStatement ps;<br>&nbsp;ResultSet rs;<br><span style="COLOR: #339966">&nbsp;//检查是否已注册<br></span>&nbsp;public boolean checkLogin(ArrayList arr)<br>&nbsp;{<br>&nbsp;&nbsp;<span style="COLOR: #339966">//从数据访问组件dbPool中取得连接<br></span>&nbsp;&nbsp;try{&nbsp;<br>&nbsp;&nbsp;conn=DbPool.getConnection();&nbsp;<br>&nbsp;&nbsp;String name=(String)arr.get(0);<br>&nbsp;&nbsp;String password=(String)arr.get(1);<br>&nbsp;&nbsp;String sql="select * from test where username=? and password=?";<br>&nbsp;&nbsp;ps=conn.prepareStatement(sql);<br>&nbsp;&nbsp;ps.setString(1,name);<br>&nbsp;&nbsp;ps.setString(2,password);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;rs=ps.executeQuery();<br>&nbsp;&nbsp;if(rs.next()){<br>&nbsp;&nbsp;&nbsp;DbPool.dbClose(conn,ps,rs); <span style="COLOR: #339966">//释放资源<br></span>&nbsp;&nbsp;&nbsp;return true;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;&nbsp;DbPool.dbClose(conn,ps,rs);<br>&nbsp;&nbsp;&nbsp;&nbsp;return false;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}catch(SQLException e){<br>&nbsp;&nbsp;&nbsp;System.out.print("SQLException"+e.getMessage());<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本例的数据库访问组件是dbPool，dbPool从一个属性文件db.properties中获得数据库驱动程序，URL，用户名和密码，然后利用这些信息连接一数据库，取得连接。因为所用数据库是SQL Server，数据库驱动程序采用com.microsoft.jdbc.sqlserver.SQLServerDriver，数据库URL为jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test;本例需要把数据库驱动程序（3个jar包）放在lib目录下。<br><br><span style="COLOR: #ff00ff">DbPool.java:</span><br><br>package chap1;<br>import java.io.*;<br>import java.util.*;<br>import java.sql.*;</p>
<p style="COLOR: #000000">public class DbPool {<br>&nbsp;private static DbPool instance=null;<br><span style="COLOR: #339966">&nbsp;//取得连接</span><br>&nbsp;public static synchronized Connection getConnection(){&nbsp; <span style="COLOR: #339966">//多线程.<br></span>&nbsp;&nbsp;if(instance == null){<br>&nbsp;&nbsp;&nbsp;instance = new DbPool();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return instance._getConnection();<br>&nbsp;}<br>&nbsp;private DbPool()<br>&nbsp;{<br>&nbsp;&nbsp;super();<br>&nbsp;}<br>&nbsp;private Connection _getConnection(){<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;String sDBDriver=null;<br>&nbsp;&nbsp;&nbsp;String sConnection=null;<br>&nbsp;&nbsp;&nbsp;String sUser=null;<br>&nbsp;&nbsp;&nbsp;String sPassword=null;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;Properties p=new Properties();<br>&nbsp;&nbsp;&nbsp;InputStream is=getClass().getResourceAsStream("/db.properties");<br>&nbsp;&nbsp;&nbsp;p.load(is);<br>&nbsp;&nbsp;&nbsp;sDBDriver=p.getProperty("DBDriver",sDBDriver);<br>&nbsp;&nbsp;&nbsp;sConnection=p.getProperty("Connection",sConnection);<br>&nbsp;&nbsp;&nbsp;sUser=p.getProperty("User",sUser);<br>&nbsp;&nbsp;&nbsp;sPassword=p.getProperty("Password",sPassword);<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;Properties pr=new Properties();<br>&nbsp;&nbsp;&nbsp;pr.put("user",sUser);<br>&nbsp;&nbsp;&nbsp;pr.put("password",sPassword);<br>&nbsp;&nbsp;&nbsp;pr.put("characterEncoding","GB2312");<br>&nbsp;&nbsp;&nbsp;pr.put("userUnicode","TRUE");<br>&nbsp;&nbsp;&nbsp;Class.forName(sDBDriver).newInstance(); <br>&nbsp;&nbsp;&nbsp;return DriverManager.getConnection(sConnection, pr);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; &nbsp;catch(Exception se){<br>&nbsp;&nbsp; &nbsp;&nbsp;System.out.println(se.getMessage());<br>&nbsp;&nbsp; &nbsp;&nbsp;return null;<br>&nbsp;&nbsp;}<br>&nbsp;}<br><span style="COLOR: #339966">&nbsp;//释放资源</span><br>&nbsp;public static void dbClose(Connection conn,PreparedStatement ps,ResultSet rs)<br>&nbsp;&nbsp;throws SQLException<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;rs.close();<br>&nbsp;&nbsp;&nbsp;ps.close();<br>&nbsp;&nbsp;&nbsp;conn.close();<br>&nbsp;&nbsp;}<br>}<br><br><span style="COLOR: #ff00ff">db.properties:</span><br><br>DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver<br>Connection=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test;<br>User=sa<br>Password=sa<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译loginServlet.java时，需要引用javax.servlet和javax.servlet.http两个软件包。Sun的JDK一般不包含这两个软件包。这两个软件包包含在servlet.jar中。因此在编译servlet时，需要引用servlet.jar。假如servlet.jar放在d:\library目录中，servlet程序放在d:\login目录中，要用javac编译servlet程序，则编译命令如下：<br>D:\javac&nbsp; -classpath&nbsp; "d:\library\servlet.jar"&nbsp; login\*.java<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在实际的运行中，有一些细节是需要注意的，我将jsp文件放在了一个文件夹jsp中，所以遇到了一些问题：<br>1.jsp页面中action属性是与url-pattern对应的，程序首先与url-pattern对应，然后通过映射找到实际的servlet类。<br>2.jsp页面中action属性内容中如果含有&#8220;/&#8221;，例如：action="/login"，则系统将在webapps目录下开始查找对应的servlet类，如果不含有，则从本工程目录下查找servlet类。&nbsp;<br><br><br><br></p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/118635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-05-27 10:11 <a href="http://www.blogjava.net/supdreamer/articles/118635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JDBC查询数据库</title><link>http://www.blogjava.net/supdreamer/articles/118560.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Sat, 19 May 2007 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/118560.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/118560.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/118560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/118560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/118560.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 14pt">JDBC API的核心组件：</span><br>1.DriverManager类：用语跟踪可用的JDBC驱动程序并产生数据库连接。<br><br>2.Connection接口：用于取得数据库信息、生成数据库语句，并管理数据库事务。<br><br>3.Statement接口：用于在基层连接上运行SQL语句，并且生成一个结果集。Statement有两个子接口：PreparedStatement和CallableStatement。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement提供了可以与查询信息一起预编译的一种语句类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallableStatement从PreparedStatement继承而来，它用来封装数据库中存储过程的执行。<br><br>4.ResultSet接口：用于访问SQL查询返回的数据。当读取结果时，可以使用它的next()方法依次定位每一行数据，然后用相应的get方法读取数据。<br><br><span style="FONT-SIZE: 14pt">用JDBC查询数据库</span><br>用JDBC查询数据库的一般步骤是：<br>1.装入数据库：在查询数据库之前，用户需要确定特定数据库厂商提供的驱动器并装入它。<br>&nbsp;<br>2.连接数据库：在装入针对某种特定数据库的驱动器之后，用户需要连接该数据库。<br>&nbsp;<br>3.查询数据库：一旦连接到数据库，用户可以通过连接来提交并检索查询结果。</p>
<ol>
    <li>为建立与数据库的连接，需要通过调用Class类的forName()方法来装入数据库特定的驱动器。例如，装载MySql的驱动器如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver");
    <li>java.sql包中包含DriverManager类和Connection接口，用来连接数据库。要连接数据库，必须先从DriverManager类生成Connection对象。要生成Connection对象，还需要数据库的URL，用户名及密码等信息。例如，有一个本地MySql数据库，名叫mydatabase，其用户名为Bill，密码为123，那么生成连接数据库的Connection对象的方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String url="jdbc:mysql://localhost/mydatabase";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con=DriverManager.getConnection(url,"Bill","123");&nbsp;
    <li>建立连接后，可使用两种对象查询数据库：Statement对象和PreparedStatement对象。<br>&nbsp;Statement对象：把简单查询语句发送到数据库，允许执行简单的查询。它有两个查询方法：executeQuery()和executeUpdate()。executeQuery()方法执行简单的选择（SELECT）查询，并返回ResultSet对象；executeUpdate()方法执行SQL的INSERT，UPDATE或DELETE语句，返回int值，给出受查询影响的行数。例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement st=con.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs=st.executeQuery("select * from students");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement对象：允许执行参数化的查询。例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String sql="select * from students where stuID=?";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrepareStatement ps=con.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.setString(1,"56789");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设定参数值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResulrSet rs=ps.executeQuery();&nbsp; //获得查询结果
    <li>查询结果<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查询结果一般封装在ResultSet对象中。ResultSet实际上是一张数据表。ResultSet对象有多种方法用来从查询结果中读取数据，如next()和getXXX(int cn)等。next()方法把光标移向下一行，getXXX(int cn)或getXXX(String colName)方法可用来检索ResultSet行中的数据，这里XXX代表列的数据类型，如String,Integer或Float,cn指结果集中的列号，colName代表列名。例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs=st.executeQuery("select * from students");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs.next())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name=rs.getString("student_name");
    <li>查询数据库示例例1-3 </li>
</ol>
<p>package chap1;</p>
<p>import java.sql.*;<br>public class JdbcTest {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String url="jdbc:mysql://localhost/test";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection con=DriverManager.getConnection(url,"root","root");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String sql="select * from test where userid=?";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement ps=con.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.setString(1,"123");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs=ps.executeQuery();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs.next()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name=rs.getString("username");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int age=rs.getInt(3);&nbsp;&nbsp;&nbsp;&nbsp; //这里的&#8220;3&#8221;指数据表中的第3个字段的值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(age);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(SQLException e){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Error"+e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</p>
<p><br>&nbsp;</p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/118560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-05-19 16:59 <a href="http://www.blogjava.net/supdreamer/articles/118560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见的数据库驱动和数据库URL</title><link>http://www.blogjava.net/supdreamer/articles/118457.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Fri, 18 May 2007 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/118457.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/118457.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/118457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/118457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/118457.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt">Oracle9i</span><br>数据库驱动：oracle.jdbc.driver.OracleDriver<br>数据库URL：jdbc:oracle:thin:@localhost:1521:dbName<br><br><span style="FONT-SIZE: 14pt">SQL Server 2000<br></span>数据库驱动：com.microsoft.jdbc.sqlserver.SQLServerDriver<br>数据库URL：jdbc:microsoft:sqlserver://localhost:1433;Database=dbName;<br><br><span style="FONT-SIZE: 14pt">MySQL</span><br>数据库驱动：com.mysql.jdbc.Driver<br>数据库URL：jdbc:mysql://localhost/dbName<br><br><span style="FONT-SIZE: 14pt">JDBC-ODBC</span><br>数据库驱动：sun.jdbc.odbc.JdbcOdbcDriver<br>数据库URL：jdbc:odbc:datasourceName
<img src ="http://www.blogjava.net/supdreamer/aggbug/118457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-05-18 21:36 <a href="http://www.blogjava.net/supdreamer/articles/118457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第1章 Java Web编程技术</title><link>http://www.blogjava.net/supdreamer/articles/117352.html</link><dc:creator>筱筱</dc:creator><author>筱筱</author><pubDate>Fri, 18 May 2007 13:11:00 GMT</pubDate><guid>http://www.blogjava.net/supdreamer/articles/117352.html</guid><wfw:comment>http://www.blogjava.net/supdreamer/comments/117352.html</wfw:comment><comments>http://www.blogjava.net/supdreamer/articles/117352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supdreamer/comments/commentRss/117352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supdreamer/services/trackbacks/117352.html</trackback:ping><description><![CDATA[<p>1.1 Java Web编程的主要组件技术<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个完整的Java Web应用软件通常是由多种组件技术构成的，一般由表示层组件、控制层组件、业务逻辑层组件及数据访问层组件组成。表示层组件通常由HTML和JSP页面构建，控制层组件一般是Servlet，业务逻辑层组件是JavaBeans或EJB,数据访问层组件是JDBC,Hibernate或CMP。此外，Java Web应用的各个组件需要在XML格式的配置文件中进行声明，然后打包，部署Java Web服务器（例如Tomcat）中运行。 <br>1.1.1 Servlet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet（Java服务器小程序）是由Java编写的服务器端程序，是由服务器端调用和执行的、按照Servlet自身规范编写的Java类。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet可以处理客户端传来的HTTP请求，并返回一个响应。它是一个Java类，具有可移植、功能强大、安全、集成、模块化和可扩展性好等特点。<br><br>例1-1：<br>package chap1;<br>import javax.servlet.*;<br>import java.io.*;<br>public class Servlet extends GenericServlet{<br>&nbsp;&nbsp;&nbsp;public void service(ServletRequest request,ServletResponse response)throws IOException<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("text/html");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter out=response.getWriter();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;html&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;body&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;h1&gt;Hello World&lt;/h1&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;/body&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;/html&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet需要部署在Web容器中，它的生命周期由Web容器管理，可以分为以下几个阶段：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 装载Servlet：这项操作一般是动态执行的。有些服务提供了相应的管理功能，可以在启动的时候就装载Servlet，并能够初始化特定的Servlet。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.创建一个Servlet实例。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.调用Servlet的init()方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.服务：如果Web容器接收到对此Servlet的请求，那么它调用Servlet的service()方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.销毁：销毁实例，通过调用Servlet的destroy()方法来销毁Servlet。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java对Servlet的支持是通过javax.servlet和javax.servlet.http两个软件实现的，其中javax.servlet.http是一个子软件包。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet软件包包含Servlet常用的接口和类，如GenericServlet,ServletConfig,ServletRequest,ServletResponse和RequestDispatcher等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.Servlet接口提供了创建Servlet的一般框架。Servlet可直接实现此接口，或者间接地通过扩展javax.servlet.GenericServlet类或javax.servlet.http.HttpServlet类来实现此接口。javax.servlet.GenericServlet类可用于创建与任何协议一起使用的Servlet.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而javax.servlet.http软件包除了继承以上的接口和类外，还包含了一些针对HTTP协议的方法、特殊请求和响应对象，如HttpServlet,HttpServletRequest,HttpServletResponse,HttpSession和HttpDispatcher等。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. HttpServlet类提供了处理不同HTTP请求类型（有GET,POSTH和PUT等）的方法，其中两种最常见的HTTP请求类型是GET和POST，它们分别是由doGet()和doPost()方法进行处理的：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected void doGet(HttpServletRequest request,HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException,java.io.IOException;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected void doPost(HttpServletRequest request,HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException,java.io.IOException;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. HttpServletRequest接口提供了处理客户请求的方法。使用这些方法，Servlet可从客户页面窗体中取得数据。例如，从客户页面窗体取得用户名（username）的方法如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name=request.getParameter("username");<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. HttpServletResponse接口提供了以HTML页面形式把请求发送给客户的方法，主要方法有setContentType(),sendRedirect()等。例如，把请求转发给下一个页面next.jsp的实现方法如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;respinse.sendRedirect("next.jsp");<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4. HttpSession接口用来记录当前Servlet中的用户会话。例如：在Web站点上注册的每个用户自动与HttpSession对象关联。Servlet可用此对象来存储关于用户会话的信息。可使用HttpSession接口的putValue()和getValue()等方法把数据寸入HttpSession对象中，或从该对象中取出数据。通过HttpServletRequest对象的getSession()方法可生成一个HttpSession对象，如下面的代码所示：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession session=request.getSession(true);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5. RequestDispatcher接口可以把Servlet的请求提交或委派给另一个资源，如Servlet，HTML文件或JSP页面。在这种情况下，源Servlet进行同样处理并把请求委派给另一个Servlet。RequestDispatcher接口封装指向特定资源（Servlet，HTML文件或JSP页面）的URL。用此接口的forward(HttpServletRequest request,HttpServletResponse response)方法委派任务到特定资源。RequestDispatcher对象可通过HttpServletRequest对象的getRequestDispatcher()方法生成。例如：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestDispatcher td=request.getRequestDispatcher("reply.jsp");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd.forward(request,response);<br><br>例1-2：<br>MyJsp.jsp:<br>&lt;FORM name="form1" method="get" action="MyFirstServlet"&gt;</p>
<p>MyFirstServlet.java:<br>package chap1;<br>import javax.servlet.http.*;<br>import javax.servlet.*;<br>import java.io.*;<br>import java.util.*;</p>
<p>public class MyFirstServlet extends HttpServlet{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void doPost(HttpServletRequest request,HttpServletResponse response){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name=request.getParameter("username");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestDispatcher rd;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(name.equals("Tom")){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession session=request.getSession(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute("nm",name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect("servlet/reply.jsp");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd=request.getRequestDispatcher("servlet/error.jsp");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd.forward(request,response);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(ServletException e){System.out.println(e);}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(IOException e){System.out.println(e);}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;public void doGet(HttpServletRequest request,HttpServletResponse response){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doPost(request,response);<br>&nbsp;&nbsp;&nbsp;}<br>}<br>在Java Web应用程序中，Servlet常用做控制器组件。当Servlet部署到Web服务器中时，需要Web配置文件Web.xml中进行声明。<br>&lt;servlet&gt;<br>&lt;servlet-name&gt;MyFirstServlet&lt;/servlet-name&gt;<br>&lt;servlet-class&gt;chap1.MyFirstServlet&lt;/servlet-class&gt;<br>&lt;/servlet&gt;<br>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;MyFirstServlet&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;/MyFirstServlet&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/supdreamer/aggbug/117352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supdreamer/" target="_blank">筱筱</a> 2007-05-18 21:11 <a href="http://www.blogjava.net/supdreamer/articles/117352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>