从Tomcat上的Struts开始

阿帕奇支柱是一个用于创建Java web应用程序的免费、开放源码框架。它的设计是为了便于使用模型-视图-控制器体系结构,它可以帮助你的应用程序保持清晰,直接,且易于维护。当时间来部署应用程序,阿帕奇Tomcat是对Struts的一个很好的补充,适合于Java servlet。让我们看看如何创建一个基本的Struts/Tomcat应用程序;我假设您已经有了一个功能齐全的Tomcat设置,并且希望开始使用Struts应用程序。

Struts中,2.3.4.1的最新产品发布,可下载或者通过发行版的包管理器。从项目网站下载的.zip文件包含所需的.jar文件以及文档和示例应用程序。

这是令人难以置信的直白地部署在Tomcat的样本之一。简单的struts-2.3.4.1 /应用/ Struts2的-blank.war复制到$ CATALINA_HOME / webapps中,重新启动Tomcat,然后访问http://本地主机:8080 / Struts2的空白/例子/的helloWorld.jsp看到的HelloWorld示例应用程序在行动。

它是怎么运行的?当你重新启动Tomcat,它解开了的.war归档到正确的目录结构,包括所有必要的.jar文件:

  • webapps/struts2-blank是上下文根目录,其中存放.html和.jsp文件。
  • webapps/struts2-blank/WEB-INF包含配置文件,比如web.xml。
  • webapps/struts2-blank/WEB-INF/src包含源文件
  • 的webapps / Struts2的空白/ WEB-INF / classes中包含的Java类。
  • 的webapps / Struts2的空白/ WEB-INF / lib中包含该应用程序运行时库。
  • 的webapps /支柱空白/ META-INF包含元数据信息,例如标签库。

当你写你自己的Struts应用程序,你需要确保建立自己这个结构。要创建一个全新的Struts应用程序,首先建立一个目录结构像这样,在$ CATALINA_HOME,其中mystruts是您的app名称:

  • 的webapps / mystruts
  • web应用/ mystruts / WEB-INF
  • webapps / mystruts / web - inf / src
  • webapps / mystruts / web - inf / classes
  • web应用/ mystruts / WEB-INF / lib中

从struts2-blank中复制需要的.jar文件:

cd $ CATALINA_HOME / webapps / struts2-blank / web - inf / lib / cp commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar \ \ freemarker-2.3.19.jar javassist-3.11.0.GA.jar ognl-3.0.5.jar \ \ struts2-core-2.3.4.1.jar xwork-core-2.3.4.1.jar CATALINA_HOME美元/ webapps / mystruts / web - inf / lib

创建mystruts / web - inf /。xml,一个Tomcat的过滤器这将确保所有的URL由Struts的处理:

:的xsi =”http://www.w3.org/2001/XMLSchema-instance “的xsi:的schemaLocation =” http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/的JavaEE /网络app_2_5.xsd“> <滤波器> <滤波器名称> struts2的 <滤波器级> org.apache.struts2.dispatcher.FilterDispatcher   <滤波器-mapping> <滤波器名称> struts2的  / *   

过滤器Struts2的链接到类org.apache.struts2.dispatcher.FilterDispatcher和所有的URL(/ *)被发送到该滤波器。

我们的应用程序结构将是模型-视图-控制器。java将同时充当模型类和Action类,前者存储后端(在本例中,这只是一条消息),后者通过显示特定视图来响应用户操作。(在更复杂的示例中,您将拆分模型和Action类。)jsp和response.jsp文件充当不同的视图,向用户显示信息。

让我们查看文件开始。这些都走在上面mystruts目录,$ CATALINA_HOME / webapps /目录mystruts。该的Input.jsp代码如下所示:

<%@page contentType="text/html" page编码="UTF-8"%> <%@taglib uri="http://www.openlogic.com/struts-tags"前缀="s" %>   My Struts




   

谁的Struts?

taglib在最上面一行说,我们将使用Struts标签,按照给定的URI,并与前面的他们(识别)小号。再往下,我们使用Struts标签成立,其作用是调用MyStruts类的表单。它有一个文本框,称为用户名,以及一个提交按钮。如果您理解HTML,这里的标记格式应该相当简单。

jsp文件更简单:

<%@页面的contentType = “text / html的” 的pageEncoding = “UTF-8” %> <%@标签库URI = “http://www.openlogic.com/struts-tags” 前缀= “S” %>   谁Struts的响应</ TITLE> </ HEAD> <BODY> <H1> <S:属性值= “消息”/> </ H1> <S:形式行动=“HTTP://www.openlogic.com/input.jsp”> <S:提交值= “后退”/> </ s的:形式> </ BODY> </ HTML></code></pre>
       <p>标题是有趣的一行。属性值<code>信息</code>调用<code>的getMessage()</code>Action类,在这里是MyStruts的方法。(如果属性值分别为<code>平</code>,它会调用<code>getPing ()</code>方法。)然后将此方法返回的字符串显示给用户。</p>
       <p>的形式简单地下方使用户返回到该输入形式。</p>
       <p>接下来,让我们建立了我们的Action类,mystruts / WEB-INF / src目录/例子/ MyStruts.java:</p>
       <pre class="prettyprint"><code>打包例子;公共类MyStruts {私人字符串信息;私人字符串用户名;公共字符串执行(){setMessage(getUsername()+ “的Struts的”);返回“成功”;}公共字符串的getMessage(){返回消息;}公共无效setMessage(字符串消息){this.message =消息;}公共字符串getUsername(){返回用户名;}公共无效setUsername(字符串username){this.username =用户名;}}</code></pre>
       <p>这应该很简单;get和set方法完全按照它们在罐头上说的做。注意,我们必须有<code>execute ()</code>方法,以在调用操作类时运行。</p>
       <p>最后,我们需要编辑mystruts/WEB-INF/classes/struts.xml来将所有这些类绑定在一起:</p>
       <pre class="prettyprint"><code>< ?编码="UTF-8" ?> <!"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="MyStruts" class="example "MyStruts”> <结果名称= "成功" > /响应。jsp</result> </action> </package> </struts></code></pre>
       <p>此代码与特定的类特定的操作。该行动被称为的Input.jsp,这个代码将它引导到正确的类和运行<code>execute ()</code>方法。的结果<code>MyStruts.execute()</code>然后用的response.jsp显示有关。</p>
       <p>为了让一切运行,我们需要将这些文件编译成子目录中的类:</p>
       <pre class="prettyprint"><code>CD $ CATALINA_HOME / webapps /目录WEB-INF javac的-d类的src /例子/ MyStruts.java</code></pre>
       <p>重新启动Tomcat,并去看看在http://本地主机:8080 / mystruts /的Input.jsp。您应该看到您的形式,当你输入一个名称,然后单击发送它应该工作。</p>
       <p>到目前为止,一切顺利!但是,如果查看http://localhost:8080/mystruts/mystruts。操作,它将直接将您发送到response.jsp页面,但是由于没有输入名称,所以它将使用Null。要解决这个问题,请改变<code>execute ()</code>方法在MyStruts.java:</p>
       <pre class="prettyprint"><code>进口com.opensymphony.xwork2.ActionSupport;公共类MyStruts扩展了ActionSupport {...公共字符串的execute(){如果(getUsername()!= NULL){setMessage(getUsername()+ “的Struts的”);返回成功;}其他{返回NONE;}} ...}</code></pre>
       <p>我们现在扩展引用Action接口ActionSupport类,它看起来像这样:</p>
       <pre class="prettyprint"><code>public interface Action {public static final String SUCCESS = " SUCCESS ";public static final String NONE = " NONE ";public static final String ERROR = " ERROR ";public static final字符串INPUT = " INPUT ";public static final String LOGIN = " LOGIN ";公共字符串execute()抛出异常;}</code></pre>
       <p>您还需要编辑struts.xml:</p>
       <pre class="prettyprint"><code><行动name = " MyStruts " class = "的例子。MyStruts"> <result name="none" type="redirect">/input。结果jsp < / > < name =“成功”结果> /响应。行动结果jsp < / > < / ></code></pre>
       <p>这将创建一个重定向(其开始从客户端的新要求,丢失任何现有数据 - 而不是像一个取消按钮)回到原来的输入页面,如果没有存储的名称。</p>
       <p>重新编译应用程序并重新启动Tomcat和http://localhost:8080/mystruts/mystruts。action或http://localhost:8080/mystruts/mystruts都应按预期执行。</p>
       <p>为了从http使这项工作://本地主机:8080 / mystruts,添加index.html的根目录:</p>
       <pre class="prettyprint"><code><!DOCTYPE HTML PUBLIC “ -  // W3C // DTD HTML 4.0过渡// EN”> <HTML> <HEAD> <META HTTP-EQUIV = “刷新” CONTENT = “0; URL = MyStruts.action”> </HEAD> <BODY> <p>装载MyStruts ... </ p> </ BODY> </ HTML></code></pre>
       <p>在创建index.html之后,不需要重新启动Tomcat。</p>
       <h2>接下来的步骤和资源</h2>
       <p>这是在Struts的和Tomcat如何合作基本面貌。一旦你已经得到了基本概念下,有大量的详细信息,在那里让你Struts的专家地位在任何时间。该<a href="http://struts.apache.org/2.x/index.html" rel="nofollow">Struts 2文档</a>都是优秀而全面的,包括教程、指南和一本烹饪书。还有一个收藏<a href="https://cwiki.apache.org/S2PLUGINS/home.html" rel="nofollow">Struts 2个的插件</a>可用,虽然这些都不是官方的Struts框架的一部分,所以买家当心。然而,他们可以是一个伟大的选择,如果你不想推倒重来;它们可以使你的Struts web应用程序的开发更快运行。</p>
       <figure>
        <img data-original="http://track.hubspot.com/__ptq.gif?a=172122&k=14&bu=http://www.openlogic.com/wazi/&r=http://www.openlogic.com/wazi/bid/238187/Starting-out-with-Struts-on-Tomcat&bvt=rss" class="lazy" loading="lazy">
       </figure>
       <figure>
        <img data-original="http://feeds.feedburner.com/~r/openlogic/wazi/~4/M7VdfcT8OM8" class="lazy" loading="lazy">
       </figure>
       <div class="end-note">
        <!-- blx4 #2005 blox4.html  -->
        <div id="" class="blx blxParticleendnote blxM2005  blox4_html  blxC23909">
         加入网络世界社区有个足球雷竞技app<a href="https://www.facebook.com/NetworkWorld/" target="_blank">脸谱网</a>和<a href="https://www.linkedin.com/company/network-world" target="_blank">LinkedIn</a>对最重要的话题发表评论。</div>
       </div>
      </div>
      <div class="apart-alt tags">
       <span class="related">有关:</span>
       <ul>
        <li><a class="edition-link-url primary-cat-url2" href="//m.amiribrahem.com/category/opensource-subnet"><span class="primary-cat-name2">开源(重复)</span></a></li>
        <li><a class="edition-link-url primary-cat-url2" href="//m.amiribrahem.com/category/open-source-tools"><span class="primary-cat-name2">开源</span></a></li>
       </ul>
      </div>
      <p class="content-copy">版权所有©2012<span class="ccbu">Raybet2</span></p>
      <!-- blx4 #1524 blox4.article.toaster  -->
      <div class="article-intercept">
       <a href="https://www.idginsiderpro.com/article/3526496/it-salary-survey-2020-the-results-are-in.html"><i class="ss-icon ss-navigateright"></i><em>IT薪资调查:</em>结果是</a>
      </div>
      <style>
@media only screen and (min-width: 60.625em) {
	article .apart.ad.not-lazy {
		margin-left: 0;
		float: right;
	}
}
/* this spaces the ads in the right rail */
@media only screen and ( min-width: 48em ) {
	article #drr-top-ad.epo.cat-narrow #imu2 {
		margin-top: 390px; /*originally 354px*/
	}
	.topDeals.topper {
		margin-top: 390px;
	}
}
@media only screen and ( min-width: 48em ) and ( max-width: 58.063em ) {
	article #drr-top-ad.epo.cat-narrow #imu2 {
		margin-top: 0;
	}
}
@media only screen and ( min-width: 60.625em ) {
	article #drr-top-ad.epo.cat-narrow #imu2 {
		margin-top: 390px; /*originally 354px*/
	}
	.topDeals.topper {
		margin-top: 390px;
	}
}
@media only screen and ( min-width: 48em ) {
	article #drr-top-ad.epo.cat-narrow div[id^=imu] {
		margin-top: 390px;
	}
}
@media only screen and ( min-width: 48em ) and ( max-width: 58.063em ) {
	article #drr-top-ad.epo.cat-narrow div[id^=imu] {
		margin-top: 0;
	}
}
@media only screen and ( min-width: 60.625em ) {
	article #drr-top-ad.epo.cat-narrow div[id^=imu] {
		margin-top: 390px;
	}
}
</style>
     </section>
     <!-- /.bodee -->
     <div id="content-recommender">
      <div class="OUTBRAIN" data-widget-id="AR_1" data-ob-template="NetworkWorld"></div>
     </div>
     <div class="lazyload_ad">
      <code type="text/javascript">
       <!--
						var slotName = 'bottomleaderboard';
						var slotSize = [];
						if ($thm.deviceClass == 'mobile') {
							slotSize = [[300,50],[320,50],[300,250]];
						}
						else if ($thm.deviceClass == 'tablet') {
							slotSize = [[728,90],[468,60]];
						}
						else {
							slotSize = [[728,90],[970,90],[970,250]];
						}
						IDG.GPT.addDisplayedAd(slotName, "true");
						document.write('<div id="' + slotName + '" class="ad-container">');
						consent.ads.queue.push(function(){
							IDG.GPT.defineGoogleTagSlot(slotName, slotSize, false, true);});
						document.write('</div>');
						consent.ads.queue.push(function(){
							$('#' + slotName).responsiveAd({screenSize:'971 1115', scriptTags: []}, true);});
						//--></code>
     </div>
     <link rel="stylesheet" href="//m.amiribrahem.com/www.idgcsmb/css/tso-links.css?v=20200729113453">
     <div id="tso-wrapper">
      <div id="tso" style="display:none"></div>
     </div>
    </article>
   </section>
   <!-- /role=main -->
  </div>
  <!-- /#page-wrapper -->
  <link rel="stylesheet" href="//m.amiribrahem.com/www.idge/css/foot.css?v=20200729113453">
  <link rel="stylesheet" href="//m.amiribrahem.com/www.idge.nww/css/foot.css?v=20200729113453">
  <footer>
   <section class="brand" itemscope itemtype="http://schema.org/Organization">
    <a href="//m.amiribrahem.com/"><span class="logo">有个足球雷竞技app</span></a>
    <span class="tagline"></span>
    <span class="follow"><label>跟着我们</label>
     <ul>
      <li class="lnkdn"><a class="social-media-li-foot" href="http://www.linkedin.com/company/network-world" itemprop="sameAs" rel="nofollow" target="_blank" onclick="brandFollowTrack('LinkedIn')"><i class="ss-icon ss-social-circle brand ss-linkedin"></i></a></li>
      <li><a class="social-media-tw-foot" href="https://twitter.com/networkworld" itemprop="sameAs" rel="nofollow" target="_blank" onclick="brandFollowTrack('Twitter')"><i class="ss-icon ss-social-circle ss-twitter"></i></a></li>
      <li><a class="social-media-fb-foot" href="https://www.facebook.com/NetworkWorld/" itemprop="sameAs" rel="nofollow" target="_blank" onclick="brandFollowTrack('Facebook')"><i class="ss-icon ss-social-circle brand ss-facebook"></i></a></li>
     </ul></span>
   </section>
   <section class="topics"></section>
   <section class="about">
    <div class="wrapper">
     <nav class="tertiary" id="ft3">
      <ul>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/about.html">关于我们</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/contactus.html">联系</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/privacy.html">隐私政策</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/cookie-policy.html">rayapp
</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/member-preferences.html">dota2雷竞技
</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/contactus.html">广告</a></li>
       <li><a class="edition-link-url" href="https://www.idg.com/work-here/" target="_blank" rel="nofollow">IDG招聘</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/adchoices.html">lol滚球 雷竞技
</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/affiliates.html">电子商务链接</a></li>
       <li><a class="edition-link-url" href="//m.amiribrahem.com/about/ccpa.html">加州:不要出售我的个人信息</a></li>
      </ul>
     </nav>
    </div>
   </section>
   <section class="copyright">
    <div class="wrapper">
     <img src="https://alt.idgesg.net/images/logos/logo-footer-black.png" alt="IDG通信">
     <p><a href="//m.amiribrahem.com/about/copyright.html">版权</a>©2020<span class="bu">Raybet2</span></p>
     <div class="network">
      <div id="network-selector">
       <div class="label">
        探索IDG网络<i class="ss-icon tick">降序</i>
       </div>
       <ul>
        <li><a href="https://www.cio.com" target="_blank" rel="nofollow">首席信息官</a></li>
        <li><a href="https://www.computerworld.com" target="_blank" rel="nofollow">计算机世界</a></li>
        <li><a href="https://www.csoonline.com" target="_blank" rel="nofollow">CSO在线</a></li>
        <li><a href="https://www.infoworld.com" target="_blank" rel="nofollow">InfoWorld的</a></li>
        <li><a href="//m.amiribrahem.com" target="_blank" rel="nofollow">有个足球雷竞技app</a></li>
       </ul>
      </div>
      <!-- /#network-selector -->
     </div>
     <!-- /.network -->
    </div>
    <!-- /.wrapper -->
   </section>
  </footer>
  <div id="mobilewelcomead" class=" ad-container test"></div>
  <div id="catfish" class=" ad-container test"></div>
  <!--  Begin gpt-skin -->
  <div id="gpt-skin" class=" ad-container"></div>
  <!--  End gpt-skin -->
  <!-- Include here when empty article and when not empty and article is slideshow as this script is included with DRR code in body-base.jsp. -->
  <!-- Also do not include on search page with new right rail. OC-1778 -->
  <!-- Begin comScore Tag -->
  <noscript>
   <img src="https://sb.scorecardresearch.com/p?c1=2&c2=6035308&cv=2.0&cj=1">
  </noscript>
  <!-- End comScore Tag -->
  <div id="loginModal"></div>
  <div id="logoffModal"></div>
 </body>
</html>