@原文url:http://www.cnblogs.com/zlb2013/p/3558699.html

@搭建好开发环境,现在开始进入第一个Struts入门项目。

1,我用的是MyEclipse工具,首先新建一个动态Web项目MySecondProject,如图:

---为什么叫MySecondProject因为MyFirstProject项目没有测试成功!!!

---注意新建web工程时,File--->new--->Web Project,点到”next“到第三页的时候,会有“Generate Web.xml deployment descriptor”,默认没勾选,注意要勾上,否则web项目下没有web.xml文件。如果忘记了,可以随便新建一个web工程,然后把web.xml文件拷贝过去就可以了,通用的。

---具体web目录每个文件夹和文件的作用,可以看这篇文章:http://www.cnblogs.com/feichengwulai/articles/3797739.html

 

 

 

2,在MyEclipse中配置外部Tomcat服务器(不是必须配置,MyEclipse自带的有tomcat服务器,可以直接启动)

---从MyEclipse菜单栏window中进入preferences,在搜索框 搜索“tomcat"或者在MyEclipse--->Servers目录下找到tomcat,下面出现几个tomcat,将不需要的tomcat禁用掉(Disable)只让一个你已配置好的tomcat运行 (Enable),然后在tomcat home directory 设置你安装的tomcat的目录。

---在MyEclipse中启动tomcat,下面的控制台会出现Server startup的提示,表示启动成功!!!

 ---上面是tomcat服务器的配置,下面是Web服务器的管理和启动详细介绍:

http://www.cnblogs.com/feichengwulai/articles/3804062.html

 

 

 

 

3,为了让web应用具有Struts2支持功能,必须将Struts2框架的核心库增加到Web应用中。将Struts2框架下lib路径下的下边列表中的文件复制到web应用的lib路径下。(到官网http://struts.apache.org/download.cgi下载最新的structs2,我们需要将下载好的structs2解压,然后将其中的这些jar包复制到 WEB_INF\lib 这个文件夹中):

---下载时,推荐选择Full Distribution,即下载Struts2的完整版,包括示例应用,核心库,源代码和文档等。下边是文件夹中内容:

  apps:示例应用

  docs:相关文档

  lib:核心类库

  src:struts2框架的全部源代码

---Essential Dependencies:仅下载Struts2的核心库。

---Documentation:相关文档

---Source:Struts2的全部源代码

注:(commons-lang-x.y.jar这个包需要更换为新版的commons-lang3-x.y.jar包)

---注意:复制了上边的文件后,还必须要修改web.xml文件,让该web应用加载Struts2框架。修改后,才完全具备了对Struts2框架的支持。

---上边是struts2的必需类库,将这里写类库复制到Web-inf/lib路径下。如果需要在Web应用中使用Struts2的更多特性,则需要将相应的jar文件复制到Web应用的Web-inf/lib路径下。

---注意:大部分时候,使用Struts2的web应用并不需要利用到Struts2的全部特性,因此没有必要一次将lib路径下的jar文件全部复制到Web应用的web-inf/lib路径下。

 

 4,编辑web应用的web.xml配置文件,配置struts2的核心Filter下面是增加了Struts2的核心Filter配置的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_3_0.xsd"
  id="WebApp_ID" version="3.0">
  <display-name>Struts 2</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list> //默认新建web.xml文件代码----头

  <!-- 定义Struts 2的核心Filter -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <!-- 这里重要,如果不对,jsp会连接不到struts2 -->  
  </filter>

  <!-- 让Struts2的核心Filter拦截所有请求 -->
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  </web-app> //默认新建web.xml文件代码----屁股
  
---抄头抄屁股,中间的慢慢研究。
  ---经过上边的配置后,只是完成了为web应用增加struts2支持,但依然没有使用Struts2功能,使用Struts2功能至少需要一个struts.xml配置文件,
这个配置文件默认放在web应用的类加载路径下(通常就是web-inf/classes路径,注意src目录classes目录下的文件内容是一模一样的,classes在web-inf目录下,src在项目的根目录下。)。

 

5,配置struts.xml,在src目录下,新建一个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>
</struts>
---中间有代码的实例
<?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>
<!--struts2的开发模式-->  
    <constant name="struts.devMode" value="false"/>
   <package name="helloworld" extends="struts-default">    
      <action name="hello"
            class="MyFirstPackage.HelloworldAction"
            method="execute">
            <result name="success">/HelloWorld.jsp</result>
      </action>
   </package>
   <!-- 下面是ajax请求 -->
    <!--采用json数据格式,package的extends必须是extends="json-default"-->  
    <!--并且必须要用到struts2的json-lib,struts2-json-plugin包-->  
    <!--采用异步提交方式,result的type="json",并且result节点值为空-->  
   <!-- <package name="default" namespace="/MySecondProject" extends="json-default"> -->
   <package name="default"  extends="json-default">
           <action name='ajax_test'
               class="MyFirstPackage.HelloAjax">
               <result name="success2" type='json'></result>       
               <!--
               针对异步提交,action的result节点值应该为空,
               即不能再转向(例如:只能为<result name="userInfo" type="json"></result>);
                -->
           </action>
   </package>
</struts>


          

 

6,下边是添加java类,添加jsp页面,配置struts2.xml文件。

(1),创建页面请求的Aciton类 HelloworldAction.java

package MyFirstPackage;

import java.io.UnsupportedEncodingException;

public class HelloworldAction {
    private String name;
    public String execute() throws Exception{
        return "success";
    }
    public String getName(){
        return name;
    }

    public void setName(String name)
            throws UnsupportedEncodingException{
        //this.name=changeCharset("你好","UTF-8");
        //this.name = convert(name);  //name传进来后,就乱码了
        //this.name=getEncoding(name);
        this.name=new String(name.getBytes("ISO-8859-1"),"utf-8");
        //this.name=getEncoding(changeCharset(name,"UTF-8"));
    }    

    //编码转换函数
    //str是要装换的字符串
    //newCharset是要转换的编码格式
    public String changeCharset(String str, String newCharset)  
            throws UnsupportedEncodingException {
        if (str != null) {
            //用默认字符编码解码字符串。
            byte[] bs = str.getBytes();
            //用新的字符编码生成字符串
            return new String(bs, newCharset);
        }else{
            return "";
        }
    }
    
 

    //字符串转换为unicode编码函数
    /*
    * 将字符串转成unicode
    * @param str 待转字符串
    * @return unicode字符串
    */
    public String convert(String str){   
        str = (str == null ? "" : str);
        String tmp;
        StringBuffer sb = new StringBuffer(1000);
        char c;
        int i, j;
        sb.setLength(0);
        for (i = 0; i < str.length(); i++)
        {
            c = str.charAt(i);
            sb.append("\\u");
            j = (c >>>8); //取出高8位
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
            j = (c & 0xFF); //取出低8位
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
        }
        return (new String(sb));
    }
    
    //unicode转成字符串,与上述过程反向操作即可
    /*
    * 将unicode 字符串
    * @param str 待转字符串
    * @return 普通字符串
    */
    public String revert(String str)
    {
        str = (str == null ? "" : str);
        if (str.indexOf("\\u") == -1)//如果不是unicode码则原样返回
            return str;

        StringBuffer sb = new StringBuffer(1000);
        for (int i = 0; i < str.length() - 6;)
        {
            String strTemp = str.substring(i, i + 6);
            String value = strTemp.substring(2);
            int c = 0;
            for (int j = 0; j < value.length(); j++)
            {
                char tempChar = value.charAt(j);
                int t = 0;
                switch (tempChar)
                {
                case 'a':
                    t = 10;
                    break;
                case 'b':
                    t = 11;
                    break;
                case 'c':
                    t = 12;
                    break;
                case 'd':
                    t = 13;
                    break;
                case 'e':
                    t = 14;
                    break;
                case 'f':
                    t = 15;
                    break;
                default:
                    t = tempChar - 48;
                    break;
                }
                c += t * ((int) Math.pow(16, (value.length() - j - 1)));
            }
            sb.append((char) c);
            i = i + 6;
        }
        return sb.toString();
    }
    
    //编码判断函数
    public static String getEncoding(String str) {      
        String encode = "GB2312";      
        try {      
            if (str.equals(new String(str.getBytes(encode), encode))) {      
                String s = encode;      
                return s;      
            }      
        } catch (Exception exception) {      
        }      
        encode = "ISO-8859-1";      
        try {      
            if (str.equals(new String(str.getBytes(encode), encode))) {      
                String s1 = encode;      
                return s1;      
            }      
        } catch (Exception exception1) {      
        }      
        encode = "UTF-8";      
        try {      
            if (str.equals(new String(str.getBytes(encode), encode))) {      
                String s2 = encode;      
                return s2;      
            }      
        } catch (Exception exception2) {      
        }      
        encode = "GBK";      
        try {      
            if (str.equals(new String(str.getBytes(encode), encode))) {      
                String s3 = encode;      
                return s3;      
            }      
        } catch (Exception exception3) {      
        }      
        return "";      
    }     
}
 

(1.5),创建ajax的请求Aciton类 HelloAjax.java
package MyFirstPackage;

public class HelloAjax {
    private String name;
    public String execute(){
        return "success2";
    }
    
    //如果之类不设置值,和返回值(即这两个方法的话),返回的就是空,一对大括号。
    public String getName(){
        //return name;   //如果name的值为null,返回的json数据就是这样的{"name":null}
        return "nibuhao"; //注意,这里返回的是name的值,返回什么,name的值就是什么,即使不用set方法设置name的值。
    }
    /*
    public void setName(String name){    
            this.name=name;
    }
    */
}



(2),创建视图(前端jsp界面)HelloWorld.jsp,一个jsp页面
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- /</%request.setCharacterEncoding("gb2312");/%/> 这里设置对请求进行统一编码-->
<%response.setCharacterEncoding("UTF-8");%>
<%request.setCharacterEncoding("UTF-8");%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
    手动输出:<%
        out.print("你好!");
     %><br/>
     获得url参数:<%=new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8")%><br/>
   Hello World, <s:property value='name'/>
</body>
</html>



(3),创建主页面index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%response.setCharacterEncoding("UTF-8");%>
<%request.setCharacterEncoding("UTF-8");%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World2</title>
<script type="text/javascript" src="js/jquery-1.5.2.js"></script>
</head>
<%!
public int count;
public String info()
{
    return "Hello world!";    
} %>

<body>
   <h1>Hello World From Struts2</h1>
   <form action="hello">
      <label for="name">Please enter your name</label><br/>
      <input type="text" name="name"/>     
      <input type="submit" value="Say Hello"/><br/>
      <input type="text" id="testAjax"  name="name2"/>点击输入窗口测试ajax请求
      <br/>
      <%=++count %>
      <%=info() %>
      <br/>
      <!-- Java脚本,这些脚本对HTML的标签产生作用 -->
        <%
            for(int i = 0; i < 10; i++) {
        %>
        <!-- 上面的循环将控制<tr>标签循环 -->
        <tr>
            <td>循环值:</td>
            <td><%=i%></td>
        </tr>
        <br/>
        <%
            }
        %>
    </form>
         手动测试:<%
        out.print("你好");
    %>
</body>
<script type="text/javascript">
    $("#testAjax").click(function() {
        alert("你好a");
        //注意ajax请求路径问题,/MySecondProject表示网站根目录,ajax_test表示网站根目录下的请求对象。该对象在struts.xml中有配置。
        $.get("/MySecondProject/ajax_test", function(data) {
        //$.post("MySecondProject/ajax_test.action", function(data) {  ////这样也可以
            alert(data.name);
        },"json");
    });    
</script>
</html>











(6),启动index.jsp页面,如下所示
---输入名字,会跳转到HelloWorld.jsp页面
 

 ---点击下边输入窗口,会发送ajax请求。弹出ajax请求返回结果。

posted on 2014-04-11 15:36  学到老死  阅读(356)  评论(0)    收藏  举报