web-j2EE整合(一)
一、web工程创建
1.创建web工程(简单方式在Myeclipse环境中直接直接创建web工程)
2.将web工程发布到tomcat中运行,运行正常
3.在浏览器中测试成功
二、web工程集成struts2?
1.在 “一”中,添加struts2
2.选择将要使用的struts2 的版本:(选择2.0.6)
3.将struts2 将要使用的 jar拷贝至项目中;
commons-fileupload-1.2.2.jar
commons-logging-1.0.4.jar ? 提供java日志操作API,抽象出日志接口,方便操作
freemarker-2.3.8.jar ? ? ? ? freemarker模板视图支持,struts2标签主题支持
ognl-2.6.11.jar ? ? ? ? ? ? ? ? OGNL表达式支持
struts2-core-2.0.14.jar ? ? ? ? ?struts2框架
xwork-2.0.7.jar ? ? ? ? ? ? 命令模式框架支持
javassist-3.11.0.GA.jar
commons-io-2.0.1.jarIO操作
commons-langs-3.1.jar ? ? ? ? ?提供java常用操作API,比如字符串处理,XML解析等
4.在web.xml添加对struts2 的支持
添加struts2 的核心过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"?
xmlns="http://java.sun.com/xml/ns/j2ee"?
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee?
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- DTD可以从任何一个web文件中拷贝出来,例如从tomcat中拷贝 -->
<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>index.jsp</welcome-file>
? </welcome-file-list>
</web-app>
5.在src下穿件struts.xml 文件
头文件 可以去 struts jar中拷出来
<?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>
<package name="test" extends="struts-default" namespace="/struts2"></package>
</struts>
5.1 ? 拷贝 ?default.properties 文件到 ?struts.xml相同目录,修改配置文件内容,修改编码 ,spring支持,上传文件文件大小 ,开发模式 等属性
?
6.重启tomcat,在浏览器中测试运行正常就好;
?
?
写一个 ?测试 类,测试 struts 转向成功 ?
?
?
?
?
三、web工程集使用servlet(问题一:servlet在struts2环境中怎么应用的?)
添加 ?servlet-api.jar ?包;
tomcat 本身就是一个web
四、在web工程中使用Logger
下载 ?apache log4j ?包
引用log4j jar包,
在class目录下配置log4j.properties配置文件(问题二:log4j 的配置文件是怎么读入程序中使用的,为什么将log4j.properties文件放置在classes目录下就可以使用了)
在java类中 调用:
private static final Logger log=Logger.getLogger(类名.class);
五、为web工程添加filter
编写java类,必须 实现 ?Filter ?接口方法;
在web.xml中定义 filter?
配置filter 映射的路径(参照struts2配置)
六、 ?为web工程添加拦截器(Interceptor)
(问题四:为action添加拦截器之后再action中原来可以得到的JSP页面的参数 得不到了?)
编写java类,实现Interceptor接口
在类中编写处理逻辑
在action 中配置拦截器
<interceptors>
<interceptor name="testInterceptor" method="login">
<interceptor-ref name="testInterceptor"></interceptor-ref>
<result name="success">/page/struts2/interceptor.jsp</result>
</action>
以上配置是会出问题(因为为action添加了拦截器后,默认的拦截器就会失效,也就是说struts2中的内置拦截器就不起作用,但是在struts2中大部分业务还是通过默认拦截器实现的,例如param拦截器,如果不使用,页面表单提交,参数在action中得不到)
所以在使用拦截器时,一定要配置添加上默认的拦截器,
<interceptors>
<interceptor name="testInterceptor" >
<interceptor-ref name="test"></interceptor-ref>
<result name="success">/page/struts2/welcome.jsp</result>
<result name="error">/page/struts2/loginNomal.jsp</result>
</action>
启动web工程,拦截器添加完成
拦截器是作用在整个action中的,也可以为某个方法提供拦截器,需要实现,
该接口提供了 doInterceptor方法,实现该方法和原来拦截器方法没有区别;
?
?
?
七、为web工程添加监听器(Listener) (问题三:filter、interceptor、LIstener 三者的作用及区别和联系)
为Web添加Listener的步骤:
?1.建立Listener实现类
?2.在web.xml中配置Listener
?
八、在Struts2中 struts2 的Action是如何访问Servlet API 的:(问题四:在action中如何访问servlet的属性,也就是JSPServlet中的属性,例如,session、request、、、、、)
Struts2的Action没有与任何的ServletAPI 耦合,这是Struts2 的改良支出,因为Action类不在与ServletAPI 耦合,从而能更轻松的测试Action
但是对于Web工程而言,不访问ServletAPI几乎是不可能的,所以Struts2 提供了一种更轻松的方式来访问Servlet API即ActionContext,Struts2提供了ActionContext类来访问Servlet API 。
?
具体实现参照ActionContext 类的API ;
核心代码:
ActionContext act = ActionContext.getContext();
? ?act.getApplication();
? ?act.getSession();
? ?HttpServletRequest request = (HttpServletRequest) act.get(ServletActionContext.HTTP_REQUEST);
? ?HttpServletResponse response = (HttpServletResponse) act.get(ServletActionContext.HTTP_RESPONSE);
Action 直接访问 Servlet API ?
action ?实现 ServletResponseAware ?即可 访问 Response?
?
九、Web工程添加Ajax支持
Ajax使用:
使用XMLHttpRequest发送对象的步骤:
1. 为得到XMLHttpRequest对象实例的一个引用,可以创建一个新的实例,也可以访问包含有XMLHttpRequest实例的一个变量。
?
2. 告诉XMLHttpRequest对象,哪个函数会处理XMLHttpRequest对象状态的改变,为此要把对象的onreadystatechange属性设置为指向JavaScript函数的指针。
?
3. 指定请求的属性。XMLHttpRequest对象的open()方法会指定将发出的请求。open()方法取3个参数:一个是指示所用方法(通常是GET或POST)的串;一个是表示目标资源URL的串;一个是Boolean值,指示请求是否是异步的。
?
4. 将请求发送给服务器。XMLHttpRequest对象的send()方法把请求发送到指定的目标资源。send()方法接受一个参数,通常是一个串或一个DOM对象。这个参数作为请求体的一部分发送到目标URL。当向send()方法提供参数时,要确保open()中指定的方法是POST。如果没有数据作为请求体的一部分被发送,则使用null。
?
1.使用ajax第一步创建XMLHttpRequest 对象
因为不同浏览器中XMLHttpRequest 对象不同所以第一步,根据使用的浏览器创建不同的XMLHttpRequest对象:
?
ajax._createXMLHttpRequest=function()
{
if(window.ActiveXObject)
{
var ver=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for(var i=0;i<ver.length;i++)
{
try
{
return new ActiveXObject(ver[i]);
}
catch(e)
{
continue;
}
}
}
else if(window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else
{
throw new Error("对不起,您的浏览器不支持Ajax!");
}
}
?
?
2、 封装 Ajax的 post和get方法
if(!ajax)
{
var ajax={};
}
?
ajax.sendGetRequest=function(url,fnRollback,bAsync)
{
? ? var oXMLHttpRequest=ajax._createXMLHttpRequest();
var async=true;
if(typeof bAsync=="boolean")
{
async=bAsync;
}
? ? oXMLHttpRequest.open("get",url,async);//默认异步请求
if(async)//异步
{
oXMLHttpRequest.onreadystatechange=function()
{
if(oXMLHttpRequest.readyState==4)//数据接收完毕
{
if(oXMLHttpRequest.status==200)//OK
{
fnRollback(oXMLHttpRequest);
}
}
};
}
? ? oXMLHttpRequest.send(null);
if(!async)//同步
{
fnRollback(oXMLHttpRequest);
}
}
?
ajax.sendPostRequest=function(url,params,fnRollback,bAsync)
{
? ? var oXMLHttpRequest=ajax._createXMLHttpRequest();
var async=true;
if(typeof bAsync=="boolean")
{
async=bAsync;
}
? ? oXMLHttpRequest.open("post",url,async);//默认异步请求
if(async)//异步
{
oXMLHttpRequest.onreadystatechange=function()
{
if(oXMLHttpRequest.readyState==4)//数据接收完毕
{
if(oXMLHttpRequest.status==200)//OK
{
fnRollback(oXMLHttpRequest);
}
}
};
}
oXMLHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
? ? oXMLHttpRequest.send(params);
if(!async)//同步
{
fnRollback(oXMLHttpRequest);
}
}
?
?
3.在web程序中使用 ajax的话 九可以直接调用 这里的 post和 get方法 ;
?
?
?
问题一:
理解1.在struts2 中servlet中使用的HTTPRequest 可以使用ActionContxt 来获得!将其放置在拦截器中即可;
?
web中集成struts2 后用户信息可以通过struts2的拦截器在拦截器中通过使用ActionContext来过的Servlet容器的变量,
把jsp中的servlet数据在后台拦截到;
?
问题二:
?
?
问题三:
?
问题四:
因为 action中的得到JSP页面参数是通过Action默认拦截器得到的,如果使用了自定义的拦截器,
如果自定义拦截器没有继承默认拦截器,程序就不会调用默认拦截器,所以得不到参数;
在struts2中默认拦截器中的params拦截器 是用来获得参数的;
拦截器作用在调用这个action的方法中;
?
?
面向抽象接口的编程方式:灵活
?