随笔 - 23  文章 - 11  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

http://www.jscud.com/srun/news/viewhtml/4_2005_1/26.htm

posted @ 2007-03-28 15:36 小小~咖啡豆 阅读(1459) | 评论 (0)编辑 收藏

用StrutsTestCase能很好的对Struts来进行测试,可是如果时用Spring来管理Struts的action的时候,用StrutsTestCase的常规方式是不能进行测试的,以下的一个文章对此有很好的说明:

http://www.jetmaven.net/contents/documents/p_spring_junit_combination.php

posted @ 2007-03-25 23:07 小小~咖啡豆 阅读(437) | 评论 (0)编辑 收藏

webwork的IOC(基于2.1.X版本)
webwork的ioc其实在webwork中使用起来挺方便的,虽然其功能不算强大,但是已经能很好的满足我们一般的需要了,就算我们使用spring 的ioc,如果不使用特别的功能,其一般我们也是基于接口,然后有个set方法,通过set来注入,没有太多的区别,不同的是webwork的ioc需要依赖xwork,而spring却是依赖spring这个容器。
webwork的ioc是怎么进行注入的了,我们从代码中进行分析:
首先看看拦截器的代码:

public class ComponentInterceptor extends AroundInterceptor {
//~ Static fields/initializers /////////////////////////////////////////////

public static final String COMPONENT_MANAGER = "com.opensymphony.xwork.interceptor.component.ComponentManager";

//~ Methods ////////////////////////////////////////////////////////////////

protected void after(ActionInvocation dispatcher, String result) throws Exception {
}

protected void before(ActionInvocation dispatcher) throws Exception {
ComponentManager container = (ComponentManager) ActionContext.getContext().get(COMPONENT_MANAGER);

if (container != null) {
container.initializeObject(dispatcher.getAction());
}
}
}

主要的代码用黑体标注出来了,container实际就是组件管理器,这里是一个ComponentManager接口的实现 DefaultComponentManager,然后调用了该类的方法initializeObject(dispatcher.getAction ());而dispatcher.getAction()实际就是所调用的action对象,我们再来看看 DefaultComponentManager做了什么。

public void initializeObject(Object obj) {
loadResource(obj, obj.getClass(), this);
}


private Class loadResource(Object resource, Class clazz, DefaultComponentManager dcm) {
// ~由此来判断是否要进行依赖注入
boolean resourceNotLoaded = !dcm.loadOrder.contains(resource);

if (resourceNotLoaded) {
Map resources = getResourceDependencies(clazz);

for (Iterator iterator = resources.entrySet().iterator();
iterator.hasNext();) {
Map.Entry mapEntry = (Map.Entry) iterator.next();
Class depResource = (Class) mapEntry.getKey();
DefaultComponentManager newDcm = (DefaultComponentManager) mapEntry.getValue();

try {
ResourceEnablerPair pair = setupAndOptionallyCreateResource(newDcm, depResource);
setupResource(resource, pair.enabler, pair.resource);
} catch (Exception e) {
e.printStackTrace();

if (log.isDebugEnabled()) {
log.debug("Error loading or setting up resource: " + resources.getClass().getName(), e);
}
}
}

dcm.alreadyLoaded.add(clazz);

if (resource instanceof Initializable) {
Initializable initializable = (Initializable) resource;
initializable.init();
}

dcm.resourceInstances.put(clazz, resource);
dcm.loadOrder.add(resource);
}

// now return this class's enabler
Class enabler = (Class) dcm.enablers2.get(clazz);

return enabler;
}

private Map getResourceDependencies(Class resourceClass) {
List interfaces = new ArrayList();
//~ 将所有的interface放入interfaces链表中
addAllInterfaces(resourceClass, interfaces);

Map dependencies = new HashMap();

for (Iterator iterator = interfaces.iterator(); iterator.hasNext();) {
Class anInterface = (Class) iterator.next();

DefaultComponentManager dcm = this;

while (dcm != null) {
Class possibleResource = (Class) dcm.enablers.get(anInterface);

if (possibleResource != null) {
dependencies.put(possibleResource, dcm);

break;
}
dcm = dcm.fallback;
}
}
return dependencies;
}

private void addAllInterfaces(Class clazz, List allInterfaces) {
if (clazz == null) {
return;
}

Class[] interfaces = clazz.getInterfaces();
allInterfaces.addAll(Arrays.asList(interfaces));
addAllInterfaces(clazz.getSuperclass(), allInterfaces);
}

重要的代码都用黑体进行了标注,方法initializeObject中所调用的loadResource(obj, obj.getClass(), this);就执行了查找接口,并注入接口实现类整个过程。
loadResource首先调用了getResourceDependencies(clazz);getResourceDependencies又调用了addAllInterfaces(resourceClass, interfaces);addAllInterfaces作用就是取得这个类包括这个类的父类的所有实现的接口,而getResourceDependencies方法就是对这个接口进行过滤,返回只是在配置中有的接口。setupAndOptionallyCreateResource(newDcm, depResource);进行的就是创建这些接口的实现类的对象,这个代码的内容如下:

private ResourceEnablerPair setupAndOptionallyCreateResource(DefaultComponentManager newDcm, Class depResource) throws Exception {
ResourceEnablerPair pair = new ResourceEnablerPair();
Object newResource = newDcm.resourceInstances.get(depResource);

if (newResource == null) {
newResource = ObjectFactory.getObjectFactory().buildBean(depResource);
}

pair.resource = newResource;

Class enabler = loadResource(newResource, depResource, newDcm);
pair.enabler = enabler;

return pair;
}

因为准备创建出来的接口实现类对象的接口可能又实现了其他的接口,因此再调用了loadResource(newResource, depResource, newDcm)。对象创建了,然后就是注入这个对象,setupResource(resource, pair.enabler, pair.resource)就是起这个作用的。代码如下:

private void setupResource(Object resource, Class enabler, Object newResource) {
if (enabler == null) {
return;
}

try {
enabler.getMethods()[0].invoke(resource, new Object[] {newResource});
} catch (Exception e) {
e.printStackTrace();

if (log.isDebugEnabled()) {
log.debug("Error invoking method for resource: " + resource.getClass().getName(), e);
}
}
}

每个接口只有一个set方法,通过反射机制调用这个方法将创建出来的接口实现对象注入进去。整个IOC就完成了。

posted @ 2007-03-22 10:30 小小~咖啡豆 阅读(329) | 评论 (0)编辑 收藏

http://www.scriptviewer.com/story.php?title=IntelliJ-IDEA-60-aeae

posted @ 2007-03-11 00:43 小小~咖啡豆 阅读(338) | 评论 (0)编辑 收藏

Idea6.0默认是用的自带的jdk5启动的,如果想用jdk6可以按如下办法操作:


1.将idea目录下的jre目录改名
2.将安装jdk6目录中的jre目录拷贝到idea目录下,然后在将jdk6目录中的jdk\lib\tools.jar拷贝到jre\lib下
3.修改idea.exe.vmoptions文件中的启动参数(这个不是必须的,只是提高idea的响应速度)
posted @ 2007-02-01 08:09 小小~咖啡豆 阅读(441) | 评论 (0)编辑 收藏

C/C++ Source Add Block Comment Ctrl+Shift+/ C/C++ Editor
C/C++ Source Add Include Ctrl+Shift+N C/C++ Editor
C/C++ Source Comment Ctrl+/ C/C++ Editor
C/C++ Source Find Declaration Ctrl+G C/C++ Editor
C/C++ Source Find References Ctrl+Shift+G C/C++ Editor
C/C++ Source Format Ctrl+Shift+F C/C++ Editor
C/C++ Source Go to Matching Bracket Ctrl+Shift+P C/C++ Editor
C/C++ Source Go to next C/C++ member Ctrl+Shift+向下键 C/C++ Editor
C/C++ Source Go to previous C/C++ member Ctrl+Shift+向上键 C/C++ Editor
C/C++ Source Open Declaration F3 C/C++ Editor
C/C++ Source Open Definition Ctrl+F3 C/C++ Editor
C/C++ Source Open Type Ctrl+Shift+T C/C++ Editor
C/C++ Source Remove Block Comment Ctrl+Shift+\ C/C++ Editor
C/C++ Source Show outline Ctrl+O C/C++ Editor
C/C++ Source Uncomment Ctrl+\ C/C++ Editor
Makefile Source Comment Ctrl+/ Makefile Editor
Makefile Source Open declaration F3 Makefile Editor
Makefile Source Uncomment Ctrl+\ Makefile Editor
Refactor - C/C++ Redo - Refactoring Alt+Shift+Y C/C++ Editor
Refactor - C/C++ Rename - Refactoring Alt+Shift+R C/C++ Editor
Refactor - C/C++ Undo - Refactoring Alt+Shift+Z C/C++ Editor
View Zoom In Ctrl+= 在窗口中
View Zoom Out Ctrl+- 在窗口中
搜索 工作空间中的声明 Ctrl+G 在窗口中
搜索 工作空间中的引用 Ctrl+Shift+G 在窗口中
搜索 打开"搜索"对话框 Ctrl+H 在窗口中
搜索 显示"文件中的出现位置"快速菜单 Ctrl+Shift+U 在窗口中
文件 "新建"菜单 Alt+Shift+N 在窗口中
文件 保存 Ctrl+S 在窗口中
文件 全部保存 Ctrl+Shift+S 在窗口中
文件 全部关闭 Ctrl+Shift+F4 在窗口中
文件 全部关闭 Ctrl+Shift+W 在窗口中
文件 关闭 Ctrl+F4 在窗口中
文件 关闭 Ctrl+W 在窗口中
文件 刷新 F5 在窗口中
文件 属性 Alt+Enter 在窗口中
文件 打印 Ctrl+P 在窗口中
文件 新建 Ctrl+N 在窗口中
文件 重命名 F2 在窗口中
文本编辑 上一个词语 Ctrl+左箭头 编辑文本
文本编辑 上滚行 Ctrl+向上键 编辑文本
文本编辑 下一个词语 Ctrl+右箭头 编辑文本
文本编辑 下滚行 Ctrl+向下键 编辑文本
文本编辑 全部展开 Ctrl+Numpad_Multiply 编辑文本
文本编辑 切换折叠 Ctrl+Numpad_Divide 编辑文本
文本编辑 删除上一个词语 Ctrl+Backspace 编辑文本
文本编辑 删除下一个词语 Ctrl+Delete 编辑文本
文本编辑 删除至行末 Ctrl+Shift+Delete 编辑文本
文本编辑 删除行 Ctrl+D 编辑文本
文本编辑 在当前行上面插入行 Ctrl+Shift+Enter 编辑文本
文本编辑 在当前行下面插入行 Shift+Enter 编辑文本
文本编辑 复制行 Ctrl+Alt+向下键 编辑文本
文本编辑 将行上移 Alt+向上键 编辑文本
文本编辑 将行下移 Alt+向下键 编辑文本
文本编辑 展开 Ctrl+Numpad_Add 编辑文本
文本编辑 折叠 Ctrl+Numpad_Subtract 编辑文本
文本编辑 改写切换 Insert 编辑文本
文本编辑 更改为大写 Ctrl+Shift+X 编辑文本
文本编辑 更改为小写 Ctrl+Shift+Y 编辑文本
文本编辑 选择上一个词语 Ctrl+Shift+左箭头 编辑文本
文本编辑 选择下一个词语 Ctrl+Shift+右箭头 编辑文本
文本编辑 重复行 Ctrl+Alt+向上键 编辑文本
查看 Java 包资源管理器 Alt+Shift+Q,P 在窗口中
查看 Java 声明 Alt+Shift+Q,D 在窗口中
查看 Java 类型层次结构 Alt+Shift+Q,T 在窗口中
查看 Javadoc Alt+Shift+Q,J 在窗口中
查看 变量 Alt+Shift+Q,V 在窗口中
查看 同步 Alt+Shift+Q,Y 在窗口中
查看 备忘单 Alt+Shift+Q,H 在窗口中
查看 控制台 Alt+Shift+Q,C 在窗口中
查看 搜索 Alt+Shift+Q,S 在窗口中
查看 断点 Alt+Shift+Q,B 在窗口中
查看 显示视图 (查看: 大纲) Alt+Shift+Q,O 在窗口中
查看 显示视图 (查看: 问题) Alt+Shift+Q,X 在窗口中
浏览 &Quick Cross References Alt+Shift+P 编辑 Java 源代码
浏览 Open AspectJ Type Alt+Shift+A 在窗口中
浏览 Open AspectJ Type in Hierarchy Alt+Shift+H 在窗口中
浏览 "显示位置"菜单 Alt+Shift+W 在窗口中
浏览 上一个编辑位置 Ctrl+Q 在窗口中
浏览 下一页 Ctrl+. 在窗口中
浏览 前一页 Ctrl+, 在窗口中
浏览 前移历史记录 Alt+右箭头 在窗口中
浏览 后退历史记录 Alt+左箭头 在窗口中
浏览 在层次结构中打开类型 Ctrl+Shift+H 在窗口中
浏览 快速大纲 Ctrl+O 编辑 Java 源代码
浏览 快速层次结构 Ctrl+T 编辑 Java 源代码
浏览 打开声明 F3 在窗口中
浏览 打开外部 Javadoc Shift+F2 在窗口中
浏览 打开类型 Ctrl+Shift+T 在窗口中
浏览 打开类型层次结构 F4 在窗口中
浏览 打开结构 Ctrl+F3 编辑 Java 源代码
浏览 打开调用层次结构 Ctrl+Alt+H 在窗口中
浏览 打开资源 Ctrl+Shift+R 在窗口中
浏览 转至上一个成员 Ctrl+Shift+向上键 编辑 Java 源代码
浏览 转至下一个成员 Ctrl+Shift+向下键 编辑 Java 源代码
浏览 转至匹配的方括号 Ctrl+Shift+P 编辑 Java 源代码
浏览 转至行 Ctrl+L 编辑文本
源代码 切换 Ant 标记出现 Alt+Shift+O 编辑 Ant 构建文件
源代码 切换标记出现 Alt+Shift+O 编辑 Java 源代码
源代码 切换注释 Ctrl+/ 编辑 Java 源代码
源代码 切换注释 Ctrl+7 编辑 Java 源代码
源代码 切换注释 Ctrl+Shift+C 编辑 Java 源代码
源代码 在文件中重命名 Alt+Shift+R 编辑 Ant 构建文件
源代码 快速辅助 - 在文件中重命名 Ctrl+2,R 编辑 Java 源代码
源代码 快速辅助 - 指定给字段 Ctrl+2,F 编辑 Java 源代码
源代码 快速辅助 - 指定给局部变量 Ctrl+2,L 编辑 Java 源代码
源代码 打开外部文档 Shift+F2 编辑 Ant 构建文件
源代码 显示工具提示描述 F2 编辑 Ant 构建文件
源代码 显示源代码快速菜单 Alt+Shift+S 在窗口中
源代码 格式 Ctrl+Shift+F 编辑 Ant 构建文件
源代码 格式化 Ctrl+Shift+F 编辑 Java 源代码
源代码 添加 Javadoc 注释 Alt+Shift+J 在窗口中
源代码 添加块注释 Ctrl+Shift+/ 编辑 Java 源代码
源代码 添加导入 Ctrl+Shift+M 编辑 Java 源代码
源代码 组织导入 Ctrl+Shift+O 在窗口中
源代码 缩进行 Ctrl+I 编辑 Java 源代码
源代码 除去出现注释 Alt+Shift+U 编辑 Java 源代码
源代码 除去块注释 Ctrl+Shift+\ 编辑 Java 源代码
源代码 添加 try catch 块 Alt+Shift+Z + Y 编辑 Java 源代码

窗口 上一个编辑器 Ctrl+Shift+F6 在窗口中
窗口 上一个视图 Ctrl+Shift+F7 在窗口中
窗口 上一个透视图 Ctrl+Shift+F8 在窗口中
窗口 下一个编辑器 Ctrl+F6 在窗口中
窗口 下一个视图 Ctrl+F7 在窗口中
窗口 下一个透视图 Ctrl+F8 在窗口中
窗口 切换至编辑器 Ctrl+Shift+E 在窗口中
窗口 将活动视图或编辑器最大化 Ctrl+M 在窗口中
窗口 打开编辑器下拉列表 Ctrl+E 在窗口中
窗口 显示标尺上下文菜单 Ctrl+F10 编辑文本
窗口 显示系统菜单 Alt+- 在窗口中
窗口 显示视图菜单 Ctrl+F10 在窗口中
窗口 显示键辅助 Ctrl+Shift+L 在对话框和窗口中
窗口 激活编辑器 F12 在窗口中
编辑 Add Block Comment Ctrl+Shift+/ Editing in Structured Text Editors
编辑 Format Active Elements Ctrl+I Editing in Structured Text Editors
编辑 Format Document Ctrl+Shift+F Editing in Structured Text Editors
编辑 Move Alt+Shift+V Editing JSP Source
编辑 Occurrences in File Ctrl+Shift+A Editing in Structured Text Editors
编辑 Open Selection F3 Editing in Structured Text Editors
编辑 Quick Fix Ctrl+1 Editing in Structured Text Editors
编辑 Remove Block Comment Ctrl+Shift+\ Editing in Structured Text Editors
编辑 Rename Alt+Shift+R Editing JSP Source
编辑 Rename XSD element Alt+Shift+R Editing XSD context
编辑 Restore Last Selection Alt+Shift+向下键 Editing in Structured Text Editors
编辑 Select Enclosing Element Alt+Shift+向上键 Editing in Structured Text Editors
编辑 Select Next Element Alt+Shift+右箭头 Editing in Structured Text Editors
编辑 Select Previous Element Alt+Shift+左箭头 Editing in Structured Text Editors
编辑 Show Tooltip Description F2 Editing in Structured Text Editors
编辑 Toggle Comment Ctrl+Shift+C Editing in Structured Text Editors
编辑 "快速差别"开关 Ctrl+Shift+Q 编辑文本
编辑 上下文信息 Alt+? 在窗口中
编辑 上下文信息 Alt+Shift+? 在窗口中
编辑 内容辅助 Alt+/ 在对话框和窗口中
编辑 切换插入方式 Ctrl+Shift+Insert 编辑文本
编辑 删除 Delete 在窗口中
编辑 剪切 Ctrl+X 在对话框和窗口中
编辑 剪切 Shift+Delete 在对话框和窗口中
编辑 增量查找 Ctrl+J 编辑文本
编辑 增量逆向查找 Ctrl+Shift+J 编辑文本
编辑 复制 Ctrl+C 在对话框和窗口中
编辑 复制 Ctrl+Insert 在对话框和窗口中
编辑 复原上一个选择 Alt+Shift+向下键 编辑 Java 源代码
编辑 快速修正 Ctrl+1 在窗口中
编辑 撤消 Ctrl+Z 在窗口中
编辑 文字补全 Ctrl+Alt+/ 编辑文本
编辑 显示工具提示描述 F2 编辑 Java 源代码
编辑 查找上一个 Ctrl+Shift+K 编辑文本
编辑 查找下一个 Ctrl+K 编辑文本
编辑 查找并替换 Ctrl+F 在窗口中
编辑 粘贴 Ctrl+V 在对话框和窗口中
编辑 粘贴 Shift+Insert 在对话框和窗口中
编辑 选择上一个元素 Alt+Shift+左箭头 编辑 Java 源代码
编辑 选择下一个元素 Alt+Shift+右箭头 编辑 Java 源代码
编辑 选择全部 Ctrl+A 在对话框和窗口中
编辑 选择外层元素 Alt+Shift+向上键 编辑 Java 源代码
编辑 重做 Ctrl+Y 在窗口中
运行/调试 Debug AspectJ/Java Application Alt+Shift+D,C 在窗口中
运行/调试 Debug on Server Alt+Shift+D,R 在窗口中
运行/调试 EOF Ctrl+Z 在控制台中
运行/调试 Profile on Server Alt+Shift+P,R 在窗口中
运行/调试 Run AspectJ/Java Application Alt+Shift+X,C 在窗口中
运行/调试 Run on Server Alt+Shift+X,R 在窗口中
运行/调试 切换单步执行过滤器 Shift+F5 在窗口中
运行/调试 切换行断点 Ctrl+Shift+B 在窗口中
运行/调试 单步跳入 F5 调试
运行/调试 单步跳入选择的内容 Ctrl+F5 调试
运行/调试 单步跳过 F6 调试
运行/调试 单步返回 F7 调试
运行/调试 执行 Ctrl+U 在窗口中
运行/调试 显示 Ctrl+Shift+D 在对话框和窗口中
运行/调试 检查 Ctrl+Shift+I 在对话框和窗口中
运行/调试 继续 F8 调试
运行/调试 调试 Ant 构建 Alt+Shift+D,Q 在窗口中
运行/调试 调试 Eclipse 应用程序 Alt+Shift+D,E 在窗口中
运行/调试 调试 JUnit 插件测试 Alt+Shift+D,P 在窗口中
运行/调试 调试 JUnit 测试 Alt+Shift+D,T 在窗口中
运行/调试 调试 Java Applet Alt+Shift+D,A 在窗口中
运行/调试 调试 Java 应用程序 Alt+Shift+D,J 在窗口中
运行/调试 调试 SWT 应用程序 Alt+Shift+D,S 在窗口中
运行/调试 调试上次启动 F11 在窗口中
运行/调试 运行 Ant 构建 Alt+Shift+X,Q 在窗口中
运行/调试 运行 Eclipse 应用程序 Alt+Shift+X,E 在窗口中
运行/调试 运行 JUnit 插件测试 Alt+Shift+X,P 在窗口中
运行/调试 运行 JUnit 测试 Alt+Shift+X,T 在窗口中
运行/调试 运行 Java Applet Alt+Shift+X,A 在窗口中
运行/调试 运行 Java 应用程序 Alt+Shift+X,J 在窗口中
运行/调试 运行 SWT 应用程序 Alt+Shift+X,S 在窗口中
运行/调试 运行上次启动 Ctrl+F11 在窗口中
运行/调试 运行至行 Ctrl+R 调试
重构 - Java 内联 Alt+Shift+I 在窗口中
重构 - Java 将局部变量转换为字段 Alt+Shift+F 编辑 Java 源代码
重构 - Java 抽取局部变量 Alt+Shift+L 在窗口中
重构 - Java 抽取方法 Alt+Shift+M 在窗口中
重构 - Java 撤销 - 重构 Alt+Shift+Z 在窗口中
重构 - Java 显示重构快速菜单 Alt+Shift+T 在窗口中
重构 - Java 更改方法特征符 Alt+Shift+C 在窗口中
重构 - Java 移动 - 重构 Alt+Shift+V 在窗口中
重构 - Java 重做 - 重构 Alt+Shift+Y 在窗口中
重构 - Java 重命名 - 重构 Alt+Shift+R 在窗口中
项目 全部构建 Ctrl+B 在窗口中

posted @ 2006-12-31 11:17 小小~咖啡豆 阅读(223) | 评论 (0)编辑 收藏

JDK的开源已经发布了
https://openjdk.dev.java.net/

posted @ 2006-11-14 08:08 小小~咖啡豆 阅读(470) | 评论 (0)编辑 收藏

common mail是一个小而方便的mail包,他实现了对Java Mail的封装,使用起来十分的方便,但是我在使用他的时候发现,使用纯文本的内容发送,结果是乱码,代码如下:
public class TestCommonMail {
public static void main(String[] args) throws EmailException, MessagingException {
SimpleEmail email = new SimpleEmail();
email.setCharset("GB2312");
email.setHostName("smtp.163.com");
email.setSubject("test");
email.addTo("test@163.com");
email.setFrom("test@163.com");
email.setMsg("我的测试");
email.setAuthentication("test", "test");
email.send();
}
}

分析了一下commons mail的源码找到了原因。源码如下:
public class SimpleEmail extends Email
{
public Email setMsg(String msg) throws EmailException, MessagingException
{
if (EmailUtils.isEmpty(msg))
{
throw new EmailException("Invalid message supplied");
}

setContent(msg, TEXT_PLAIN);
return this;
}
}

Email代码片段
public void setContent(Object aObject, String aContentType)
{
this.content = aObject;
if (EmailUtils.isEmpty(aContentType))
{
this.contentType = null;
}
else
{
// set the content type
this.contentType = aContentType;

// set the charset if the input was properly formed
String strMarker = "; charset=";
int charsetPos = aContentType.toLowerCase().indexOf(strMarker);
if (charsetPos != -1)
{
// find the next space (after the marker)
charsetPos += strMarker.length();
int intCharsetEnd =
aContentType.toLowerCase().indexOf(" ", charsetPos);

if (intCharsetEnd != -1)
{
this.charset =
aContentType.substring(charsetPos, intCharsetEnd);
}
else
{
this.charset = aContentType.substring(charsetPos);
}
}
}
}

email.send();的send方法将调用
public void buildMimeMessage() throws EmailException
{
try
{
this.getMailSession();
this.message = new MimeMessage(this.session);

if (EmailUtils.isNotEmpty(this.subject))
{
if (EmailUtils.isNotEmpty(this.charset))
{
this.message.setSubject(this.subject, this.charset);
}
else
{
this.message.setSubject(this.subject);
}
}

// ========================================================
// Start of replacement code
if (this.content != null)
{
this.message.setContent(this.content, this.contentType);
}
// end of replacement code
// ========================================================
else if (this.emailBody != null)
{
this.message.setContent(this.emailBody);
}
else
{
this.message.setContent("", Email.TEXT_PLAIN);
}

if (this.fromAddress != null)
{
this.message.setFrom(this.fromAddress);
}
else
{
throw new EmailException("Sender address required");
}

if (this.toList.size() + this.ccList.size() + this.bccList.size() == 0)
{
throw new EmailException(
"At least one receiver address required");
}

if (this.toList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.TO,
this.toInternetAddressArray(this.toList));
}

if (this.ccList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.CC,
this.toInternetAddressArray(this.ccList));
}

if (this.bccList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.BCC,
this.toInternetAddressArray(this.bccList));
}

if (this.replyList.size() > 0)
{
this.message.setReplyTo(
this.toInternetAddressArray(this.replyList));
}

if (this.headers.size() > 0)
{
Iterator iterHeaderKeys = this.headers.keySet().iterator();
while (iterHeaderKeys.hasNext())
{
String name = (String) iterHeaderKeys.next();
String value = (String) headers.get(name);
this.message.addHeader(name, value);
}
}

if (this.message.getSentDate() == null)
{
this.message.setSentDate(getSentDate());
}

if (this.popBeforeSmtp)
{
Store store = session.getStore("pop3");
store.connect(this.popHost, this.popUsername, this.popPassword);
}
}
catch (MessagingException me)
{
throw new EmailException(me);
}
}
由代码可以知道纯文本方式最终调用了Java Mail的
message.setContent(this.content, this.contentType);
content是内容
contentType是类型,如text/plain,
(我们可以试试直接用Java mail发邮件,设置文本内容不使用setText方法,也使用setContent("测试", "text/plain")方式,你可以看到内容也是乱码)
关键就在于text/plain,我们改成text/plain;charset=gb2312,ok乱码解决了。在commons mail我们看SimpleEmail 类中setMsg方法调用的就是 setContent(msg, TEXT_PLAIN);我们只需要将Email类中的常量TEXT_PLAIN修改一下加入 charset=你的字符集 ,重新打包jar,这样就可以了

posted @ 2006-09-18 09:54 小小~咖啡豆 阅读(1366) | 评论 (0)编辑 收藏

package org.wzywjy.mail;

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class TestMail {

public final static String SMTPSERVER = "smtp.163.com";
public final static String POPSERVER = "pop.163.com";
public final static String ACCOUNT = "test";
public final static String PWD = "test";
public final static String MAILADDR = "test@163.com";

public void sendMail(String to, String from, String subject, String body) throws AddressException, MessagingException {
Properties pro = System.getProperties();
pro.put("mail.smtp.host", SMTPSERVER);
pro.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(pro, null);

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, InternetAddress.parse(to, false)[0]);
msg.setSubject(subject);
msg.setText(body);
msg.setHeader("X-Mailer", "LOTONtechEmail");
msg.setSentDate(new Date());

Transport transport = session.getTransport("smtp");
System.out.println("connecting...");
transport.connect(SMTPSERVER, ACCOUNT, PWD);
System.out.println("Sending message");
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
}

public static void main(String[] args) {
TestMail test = new TestMail();
try {
test.sendMail(MAILADDR, MAILADDR, "test", "我的一个测试");
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}

posted @ 2006-09-15 10:30 小小~咖啡豆 阅读(295) | 评论 (1)编辑 收藏

注:这是我在网上找到的一篇文章,我按文章的步骤操作,还是有不少问题,在此我进行了修改. 原来文章地址 http://www.java-asp.net/java/200601/t_56635.html


用eclipse+xdoclet+axis开发WebService

在eclipse下开发基于axis的WebService其实很简单,但也有不少步骤,以下对每个步骤进行说明

/**
*
* @author honghao
* @axis.service scope = "Request" urn = "TestService"
*/
public class TestService {
/**
* @param name
* @axis.method
*/
public String test(String name){
return "hello " + name;
}
}

其中@axis.service表示TestService作为服务类,@axis.method表示输出test()方法作为WebService

4) 配置xdoclet
打开project->properties,在XDoclet Configurations中添加一个新的配置,可以任意取名,此处为"webservice",在这个配置中添加ejbdoclet,在其中再添加fileset用于指定对哪些文件执行xdoclet(要指明文件的路径),和axisdeploy,axisdeploy不用进行任何设置。在ejbdoclet中需要指定destdir生用于指示生成的文件所在的路径。


5) 运行xdoclet.右击项目工程,执行Run Xdoclet菜单,如果配置没有错误的话,应该在目标路径下生成deploy-TestService.xml,这是一个axis用于生成server-config.wsdd文件的部署文件。
这里需要注意的是,如果类文件是放在某个包下的时候,我无法生成deploy-TestService.xml文件,但是将类文件放在根路径下就可以生成了,原因不名.

6) 生成server-config.wsdd部署文件.这个文件其实是由axis的一个工具生成的,但是直接运行这个工具太麻烦,所以我们还需要生成一个ant构建文件,使其能自动生成:
在web项目的根路径下新建build.xml,输入以下文本:
<?xml version="1.0" encoding="UTF-8"?>
<property name="axis_lib_path" value="${axis.lib}"/>
<property name="wsdl.dir" location="wsdl" />
<path id="axis.lib.path">
<fileset dir="${axis_lib_path}">
<include name="*.jar" />
</fileset>
</path>
<path id="project.classpath">
<pathelement location="wsdl"/>
</path>
<target name="deploy">
<java classname="org.apache.axis.utils.Admin" fork="true" dir="WEB-INF"> <!--dir对应生成文件的位置-->
<classpath refid="axis.lib.path" />
<arg value="server" />
<arg value="${wsdl.dir}/deploy-TestHandler.xml" /> <!--TestHandler对应上面的xml文件名TestService-->
</java>
</target>
</project>
注意:wsdl是刚才生成的deploy-TestService.xml所在的目录,org.apache.axis.utils.Admin是axis提供的工具类,其他路径设置请根据实际项目进行适当调整。
保存后,右击build.xml执行Run->Ant 构建,如果配置正确,则会在WEB-INF目录下生成server-config.wsdd文件
还有ant编译的时候需要axis的lib。

7) 仿造axis提供的sample工程在tomcat中进行部署,在浏览器中输入
http://localhost:8080/axis/services
会列出所有的WebService
输入http://localhost:8080/axis/services/TestService?wsdl
会输出相应的wsdl内容
然后就可以用相应的工具进行测试了。

posted @ 2006-09-06 08:24 小小~咖啡豆 阅读(2324) | 评论 (0)编辑 收藏
仅列出标题
共3页: 上一页 1 2 3 下一页