@原文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
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
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;
}
*/
}
<%@ 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"(6),启动index.jsp页面,如下所示
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>
---点击下边输入窗口,会发送ajax请求。弹出ajax请求返回结果。
浙公网安备 33010602011771号