zoukankan      html  css  js  c++  java
  • struts2使用留个影(转载,适合初学者)

    使用的环境:Eclipse3.4.2 + JDK1.6 + Tomcat6.0 + Struts2.1.6

    1、新建一个Dynamic Web Project工程Struts2Test,习惯性的把WebContent改为WebRoot,建好后在工程属性Properties->Java Build Path->Source->Default output folder里把Struts2Test/build/classes修改为Struts2Test/WebRoot/WEB-INF/classes

    2、从struts文件夹下的lib文件夹中复制struts2-core-2.1.6.jar、xwork-2.1.2.jar、freemarker-2.3.13.jar、commons-logging.jar、commons-fileupload-1.2.1.jar、ognl-2.6.11.jar,在Eclipse->Struts2Test->WebRoot->WEB-INF->lib点击右键选择粘贴(当然,也可以直接复制到该目录下然后刷新lib)

    3、编辑WEB-INF/web.xml:

    代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <display-name>Struts2Test</display-name>

    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

    </web-app>

    当然,我是把struts2默认的.action后缀去掉了,所以才在<url-pattern>中使用了"/*",如果是有后缀的,如.do,应该写"/*.do"等样式
    在<filter-class>中,struts2带的例子里好像用的不是上面写的那个类,结果就因为这个,我在struts.xml中设置了struts.i18n.encoding,但不起作用,害得我折腾了两个小时,靠

    4、创建src/struts.xml和src/root_action.xml:

    代码
    struts.xml内容如下:
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <!-- 去掉默认的.action后缀 -->
    <constant name="struts.action.extension" value="" />
    <!-- 修改编码为GB18030,以免传递中文时乱码 -->
    <constant name="struts.i18n.encoding" value="GB18030" />

    <include file="root_action.xml"/>

    </struts>
    代码
    1 root_action.xml内容如下:
    2  <?xml version="1.0" encoding="UTF-8" ?>
    3  <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    4
    5  <struts>
    6
    7 <package name="default" namespace="/" extends="struts-default">
    8
    9 <!-- 登录
    10 success: 转到showxxx页显示xxx
    11 -->
    12 <action name="login" class="com.mysite.struts.test.Login">
    13 <result name="input">login.jsp</result>
    14 <result type="redirectAction">showxxx</result>
    15 </action>
    16
    17 <!-- 注销登录 -->
    18 <action name="logout" class="com.mysite.struts.test.Login" method="logout">
    19 <result type="chain">
    20 <param name="actionName">login</param>
    21 </result>
    22 </action>
    23
    24 <!-- 显示xxx
    25 input: 未登录,转到登录页面
    26 success: 成功登录,显示xxx
    27 -->
    28 <action name="showxxx" class="com.mysite.struts.test.ClassForXXX" method="showXXX">
    29 <result name="input" type="redirectAction">
    30 <param name="actionName">login</param>
    31 </result>
    32 <result>xxx.jsp</result>
    33 </action>
    34
    35 <!-- 添加新的xxx
    36 input: 未登录,转到登录页面
    37 error: 数据库错误或xxx已存在等其他错误,在原页面上显示错误信息
    38 success: 添加成功,转到showxxx页面显示更新后的xxx
    39 -->
    40 <action name="addxxx" class="com.mysite.struts.test.ClassForXXX" method="addXXX">
    41 <result name="input" type="redirectAction">
    42 <param name="actionName">login</param>
    43 </result>
    44 <result name="error" type="chain">
    45 <param name="actionName">showxxx</param>
    46 </result>
    47 <result type="redirectAction">showxxx</result>
    48 </action>
    49
    50 <!-- 把所有jsp文件都将其文件名作为action name并转过去
    51 -->
    52 <action name="*.jsp">
    53 <result type="redirectAction">{1}</result>
    54 </action>
    55 </package>
    56
    57  </struts>
    58  

    把这两个文件整合在一起是可以的,不过我觉得还是分开好,用<include file="root_action.xml"/>包含外部文件,可以包含多个。使用<constance name="" value="" />可以修改struts2的配置属性(配置属性在最后列出来)
    在root_action.xml中,namespace="/"表示URL中的根,如果改成"/sub",那在访问的时候需类似于http://test.struts.mysite.com/sub/login这样,<result>是根据action的返回值name做出相应的处理,其中type的值在后面有说明

    5、创建Login.java:

    代码
    1 package com.mysite.struts.test;
    2
    3  import javax.servlet.http.HttpSession;
    4  import org.apache.struts2.ServletActionContext;
    5
    6  public class Login extends ActionSupport {
    7 private String username;
    8 private String password;
    9
    10 /*
    11 * 登录入口(execute为Struts默认入口)
    12 */
    13 public String execute() throws Exception {
    14 if (!isValidUser()) {
    15 return INPUT;
    16 }
    17 if (!setSession()) {
    18 return INPUT;
    19 }
    20 return SUCCESS;
    21 }
    22
    23 /*
    24 * 登录注销入口
    25 */
    26 public String logout() throws Exception {
    27 setUsername((String)removeSession("username"));
    28 return SUCCESS;
    29 }
    30
    31 /*
    32 * setter/getter: username
    33 */
    34 public void setUsername(String username) {
    35 this.username = username;
    36 }
    37
    38 public String getUsername() {
    39 return username;
    40 }
    41
    42 /*
    43 * setter/getter: password
    44 */
    45 public void setPassword(String password) {
    46 this.password = password;
    47 }
    48
    49 public String getPassword() {
    50 return password;
    51 }
    52
    53 /*
    54 * 验证用户名/密码是否正确
    55 */
    56 private boolean isValidUser() {
    57 if ((username == null) || username.isEmpty()) {
    58 return false;
    59 }
    60 if ((password == null) || password.isEmpty()) {
    61 return false;
    62 }
    63 return true;
    64 }
    65
    66 /*
    67 * 设置session的值
    68 */
    69 private boolean setSession() {
    70 HttpSession session = ServletActionContext.getRequest().getSession();
    71 if (session == null) {
    72 return false;
    73 }
    74 session.setAttribute("username", username);
    75 return true;
    76 }
    77
    78 /*
    79 * 删除指定session项
    80 */
    81 private Object removeSession(String name) {
    82 Object value = null;
    83 HttpSession session = ServletActionContext.getRequest().getSession(false);
    84 if (session != null) {
    85 value = session.getAttribute(name);
    86 session.removeAttribute(name);
    87 }
    88 return value;
    89 }
    90 }

    6、创建ClassForXXX.java:

    代码
    1 package com.mysite.struts.test;
    2
    3 import javax.servlet.http.HttpSession;
    4 import org.apache.struts2.ServletActionContext;
    5
    6  public class ClassForXXX extends ActionSupport {
    7 private String error;
    8
    9 /*
    10 * 显示xxx操作入口
    11 */
    12 public String showXXX() throws Exception {
    13 if (!isLogined()) {
    14 return INPUT;
    15 }
    16 return SUCCESS;
    17 }
    18
    19 /*
    20 * 添加xxx操作入口
    21 */
    22 public String addXXX() throws Exception {
    23 if (!isLogined()) {
    24 return INPUT;
    25 }
    26 if (someError()) {
    27 return "error";
    28 }
    29 return SUCCESS;
    30 }
    31
    32 /*
    33 * setter/getter: error
    34 */
    35 public void setError(String error) {
    36 this.error = error;
    37 }
    38
    39 public String getError() {
    40 return error;
    41 }
    42
    43 /*
    44 * 判断用户是否登录
    45 */
    46 private boolean isLogined() {
    47 HttpSession session = ServletActionContext.getRequest().getSession(false);
    48 if (session == null) {
    49 return false;
    50 }
    51 String username = (String)session.getAttribute("username");
    52 if ((username == null) || username.isEmpty()) {
    53 return false;
    54 }
    55 return true;
    56 }
    57
    58 /*
    59 * 一些其他什么操作
    60 */
    61 private boolean someError() {
    62 return true;
    63 }
    64 }

    7、创建要用到的几个JSP页面,这里随便列一个login.jsp的一部分,我使用了jstl,需要在web.xml中添加下面几行:
     <jsp-config>
      <taglib>
       <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
       <taglib-location>/WEB-INF/c.tld</taglib-location>
      </taglib>
     </jsp-config>
    同时,把jstl文件夹下的lib下的jstl.jar和standard.jar复制到工程里的WEB-INF/lib下,把tld下的c.tld复制到WEN-INF下
    login.jsp的一部分如下:
    <body>
    <div>
     <form action="login" method="post">
     <ul>
      <c:if test="${error != null }"><li><c:out value="${error}" /></li></c:if>
      <li>登录名:<input type="text" name="username" value="${username}" /></li>
      <li>密码:<input type="password" name="password" /></li>
      <li><input type="submit" value="登录" /></li>
     </ul>
     </form>
    </div>
    </body>

    8、以下是struts2种的类型一览:
    Chain Result            用来处理Action链
    Dispatcher Result       用来转向页面,通常处理JSP
    FreeMarker Result       处理FreeMarker模板
    HttpHeader Result       用来控制特殊的Http行为
    Redirect Result         重定向到一个URL
    Redirect Action Result  重定向到一个Action
    Stream Result           向浏览器发送InputSream对象,通常用来处理文件下载
    Velocity Result         处理Velocity模板
    XLS Result              处理XML/XLST模板
    PlainText Result        显示原始文件内容,例如文件源代码
    S2PLUGINS:Tiles         Result 结合Tile使用

    在struts-default.xml文件中已经有了对于所有类型Result的定义:
    <result-types>
        <result-type name="chain"
                 class="com.opensymphony.xwork2.ActionChainResult"/>
        <result-type name="dispatcher"
                 class="org.apache.struts2.dispatcher.ServletDispatcherResult"
                 default="true"/>
        <result-type name="freemarker"
                 class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
        <result-type name="httpheader"
                 class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
        <result-type name="redirect"
                 class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
        <result-type name="redirectAction"
                 class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
        <result-type name="stream"
                 class="org.apache.struts2.dispatcher.StreamResult"/>
        <result-type name="velocity"
                 class="org.apache.struts2.dispatcher.VelocityResult"/>
        <result-type name="xslt"
                 class="org.apache.struts2.views.xslt.XSLTResult"/>
        <result-type name="plainText"
                 class="org.apache.struts2.dispatcher.PlainTextResult" />
        <!-- Deprecated name form scheduled for removal in Struts 2.1.0.
             The camelCase versions are preferred. See ww-1707 -->
        <result-type name="redirect-action"
                 class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
        <result-type name="plaintext"
                 class="org.apache.struts2.dispatcher.PlainTextResult" />
    </result-types>

    其中有几点要注意的:如果使用redirectAction,要传递参数的话,需要使用
    <result name="success" type="redirectAction">
     <param name="actionName">showxxx</param>
     <param name="xxxx">${hhhh}</param>
    </result>
    这种样式,其中xxxx是目标action对应类中需要有的成员且必须有setter(即setXxxx)方法,hhhh是当前action对应类中需要有的成员且必须有getter(即getHhhh)方法
    如果使用redirect,要传递参数就使用URL的方式:<result type="redirect">showxxxx?xxxx=${hhhh}</result>,这里省略了name="success",因为默认就是这个,而默认的type是dispatcher
    当然,也可以把上面的${hhhh}换成具体的字面值如1234、somestring、true等等
    不过,如果要在action之间传递参数,最好还是使用 <result type="chain">actionname</result>这种样式,如果使用redirectAction,虽然能传递参数过去,但会产生Ognl异常(这个没什么影响),这个还不是关键的,关键的是用这种类型传递参数是没有什么办法传递中文的,而是用chain类型的话,两个action之间的相同属性(带有getter/setter)的值就能相互传递过去

    9、struts2的配置参数一览:

    struts.configuration
    该属性指定加载Struts 2配置文件的配置文件管理器。该属性的默认值是org.apache.Struts2.config.DefaultConfiguration,这是Struts 2默认的配置文件管理器。如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件。

    struts.locale
    指定Web应用的默认Locale。

    struts.i18n.encoding
    指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312。

    提示  当设置该参数为GBK时,相当于调用HttpServletRequest的setCharacterEncoding方法。

    struts.objectFactory
    指定Struts 2默认的ObjectFactory Bean,该属性默认值是spring。

    struts.objectFactory.spring.autoWrite
    指定Spring框架的自动装配模式,该属性的默认值是name,即默认根据Bean的name属性自动装配。

    struts.objectFactory.spring.useClassCache
    该属性指定整合Spring框架时,是否缓存Bean实例,该属性只允许使用true和false两个属性值,它的默认值是true。通常不建议修改该属性值。

    struts.objectTypeDeterminer
    该属性指定Struts 2的类型检测机制,通常支持tiger和notiger两个属性值。

    struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta。

    注意  如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中。例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下。

    struts.multipart.saveDir
    该属性指定上传文件的临时保存路径,该属性的默认值是javax.servlet.context.tempdir。

    struts.multipart.maxSize
    该属性指定Struts 2文件上传中整个请求内容允许的最大字节数。

    struts.custom.properties
    该属性指定Struts 2应用加载用户自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性。如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以英文逗号(,)隔开。

    struts.mapper.class
    指定将HTTP请求映射到指定Action的映射器,Struts 2提供了默认的映射器:org.apache.struts2.dispatcher.mapper.DefaultActionMapper。默认映射器根据请求的前缀与Action的name属性完成映射。

    struts.action.extension
    该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

    struts.serve.static
    该属性设置是否通过JAR文件提供静态内容服务,该属性只支持true和false属性值,该属性的默认属性值是true。

    struts.serve.static.browserCache
    该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。

    struts.enable.DynamicMethodInvocation
    该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。

    struts.enable.SlashesInActionNames
    该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。

    struts.tag.altSyntax
    该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。

    struts.devMode
    该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。

    struts.i18n.reload
    该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。

    提示  开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。

    struts.ui.theme
    该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。

    struts.ui.templateDir
    该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。

    struts.ui.templateSuffix
    该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。

    struts.configuration.xml.reload
    该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。

    struts.velocity.configfile
    该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。

    struts.velocity.contexts
    该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。

    struts.velocity.toolboxlocation
    该属性指定Velocity框架的toolbox的位置。

    struts.url.http.port
    该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。

    struts.url.https.port
    该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。

    struts.url.includeParams
    该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。

    struts.custom.i18n.resources
    该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。

    struts.dispatcher.parametersWorkaround
    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。

    struts.freemarker.manager.classname
    该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。

    struts.freemarker.wrapper.altMap
    该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。

    struts.xslt.nocache
    该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。

    struts.configuration.files
    该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了

  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/ling3blog/p/1870621.html
Copyright © 2011-2022 走看看