‘J2EE’ 分类下的所有文章
2010十月1

struts.xml 配置

Struts2.0实践 评论关闭

<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts

Configuration 2.0//EN” “http://struts.apache.org/dtds/struts-2.0.dtd” >
<struts>

<!– include节点是struts2中组件化的方式 可以将每个功能模块独立到一

个xml配置文件中 然后用include节点引用 –>
<include file=”struts-default.xml”></include>
<!– package提供了将多个Action组织为一个模块的方式
?package的名字必须是唯一的 package可以扩展 当一个package扩展自
?另一个package时该package会在本身配置的基础上加入扩展的package
?的配置 父package必须在子package前配置
?name:package名称
?extends:继承的父package名称
?abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空

间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action?? –>

<package name=”com.kay.struts2″ extends=”struts-default” namespace=”/test”>
<interceptors>
??? <!– 定义拦截器
???????? name:拦截器名称
???????? class:拦截器类路径
???? –>
??? <interceptor name=”timer”

class=”com.kay.timer”></interceptor>
??? <interceptor name=”logger”

class=”com.kay.logger”></interceptor>
??? <!– 定义拦截器栈 –>
??? <interceptor-stack name=”mystack”>
??????? <interceptor-ref name=”timer”></interceptor-ref>
??????? <interceptor-ref name=”logger”></interceptor-ref>
??? </interceptor-stack>
</interceptors>

<!– 定义默认的拦截器 每个Action都会自动引用
? 如果Action中引用了其它的拦截器 默认的拦截器将无效 –>
<default-interceptor-ref name=”mystack”></default-interceptor-

ref>
<!– 全局results配置 –>
<global-results>
??? <result name=”input”>/error.jsp</result>
</global-results>

<!– Action配置 一个Action可以被多次映射(只要action配置中的name

不同)
????? name:action名称
????? class: 对应的类的路径
method: 调用Action中的方法名
–>
<action name=”hello”

class=”com.kay.struts2.Action.LoginAction”>
??? <!– 引用拦截器
???????? name:拦截器名称或拦截器栈名称
???? –>
??? <interceptor-ref name=”timer”></interceptor-ref>

??? <!– 节点配置
???????? name : result名称 和Action中返回的值相同
???????? type : result类型 不写则选用superpackage的type struts

-default.xml中的默认为dispatcher
???? –>
?<result name=”success” type=”dispatcher”>/talk.jsp</result>
?<!– 参数设置
????? name:对应Action中的get/set方法
?–>
?<param name=”url”>http://www.sina.com</param>
</action>
</package>
</struts>
ps: package? extends
<package name=”com.manage.checkLogin” extends=”struts-default”>
….
</package>

<package name=”com.manage.news” namespace=”/manage/news” extends=”com.manage.checkLogin”>
….
</package>

当多个配置文件都要引用一个package时,可将其放入一配置文件中,在struts.xml include其它文件的同时,include此文件,接着在各配置文件中直接extends此包即可。

2010十月1

得到当前索引

Struts2.0实践 评论关闭
2010十月1

jsp页面中用变量代替方法的调用

Struts2.0实践 评论关闭

<c:forEach var=”modules” items=”${SES_powers.modules}” varStatus=”status”>
?????
? </c:forEach>

SES_powers.modules 会自动调用SES_powers的getModules()方法,(即使没有modules这个变量),这样避免了在页面中引用JAVA代码

2010十月1

EI语法

Struts2.0实践 评论关闭

EI是jsp-2.0规范的一部分,tomcat-5.x版本以上都已经能够支持jsp-2.0规范,
<%@ page isELIgnored=”true” %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

.语法结构(1)使用el的时候,默认会以一定顺序搜索四个作用域,将最先找到的变量值显示出来。

??? ${expression}

1,与页面元素的操作:
??

如果我们有${username}这样一个正则表达式,它回去依次调用pageContext.getAttribute(“username”) -> request.getAttribute(“username”) -> session.getAttribute(“username”) -> application.getAttribute(“username”),只要找到某一个不为空的值就立刻返回。

?(2)指定具体的域

??????

el中的作用域 对应关系
pageContext(1) 当前页的pageContext对象
pageScope 把page作用域中的数据映射为一个map对象
requestScope(2) 把request作用域中的数据映射为一个map对象
sessionScope 把session作用域中的数据映射为一个map对象
applicationScope 把application作用域中的数据映射为一个map对象
param 对应request.getParameter()
paramValues(3) 对应request.getParameterValues()
header(4) 对应request.getHeader()
headerValues 对应request.getHeaderValues()
cookie(5) 对应request.getCookies()
initParam(6) 对应ServletContext.getInitParamter()

?? session.getAttribute(“username”)?? 等同于 ${sessionScope:username}

?? request.getParameter(String name)? 等同于 ${param:name}

(3)EI运算符

???? ${ 1 + 2 }? 结果:3

???? ${ 1 <= 2 } 结果: true

??? ${ true && false } 结果:false

??? ${ empty 2 } 结果:false //判断对象是否为空

??? ${ not empty 2 }结果:true

?? ${ 2>1 ? “yes” : “no” }

? 对string类型进行操作:

? ${fn:substring(booking.orderId,0,6)}

?? fn:contains(string, substring)? fn:endsWith(string, suffix)?? fn:length(item)? fn:split(string, separator)? fn:trim(string)

(4)调用对象方法

<c:forEach var=”modules” items=”${SES_powers.modules}” varStatus=”status”>
?????
? </c:forEach>

SES_powers.modules 会自动调用SES_powers的getModules()方法,(即使没有modules这个变量),这样避免了在页面中引用JAVA代码

注:向方法中传参http://tech.ddvip.com/2009-04/1238857014113535.html

一般最好在程序中就将数据取出,在JSP页面只进行读取数据的操作

(5)集合操作

Map
Map mapValue? = new HashMap();
?? mapValue.put(“key1″, “value1″);
?? mapValue.put(“key2″, “value2″);

request.setAttribute(“mapvalue”, mapValue);
———————————————El表达式获取
<li>输出map,采用.进行导航,也称存取器</li><br>
mapvalue.key1:${mapvalue.key1 }<br>
mapvalue.key2:${mapvalue.key2 }<br>

?List

${userlist[4].username }

(6)数组

? User[] users = new User[10];

${users[2].username }

2010十月1

jstl语法

Struts2.0实践 评论关闭

1,创建变量 <c:set>
<c:set>标签具有以下一些属性:
var:所定义或者使用的变量的名称。
scope:该变量的作用域,缺省值为page。
value:变量的值。
target :javabean名称,若存在必须指定property属性
property:javabean实例名称
例:
<c:set var=”i”? value=”0″/>
应用: ${i}

<c:set value=”xiaoT” target=”${User}” property=”userName”>
相当于:User u = new User(); u.setUserName( “xiaoT” );

2, 输出? <c:out>????? 如<c:out value=”${i}”>? 等同于 ${i}

3, 分支语句
<c:if test=”${1<2}”>????? <a href=”index.action”>index</a>??? <c:if>
在满足条件时输出 <a href=”index.action”>index</a>
因没有<c:else> 多重分支为:
<c:choose>
<c:when test=”${1<2}”>?????? </c:when>??????????????? 等同于<c:if> 为 if
<c:otherwise>?????????????????????????????????????????????????????? 等同于?????????
</c:choose>

4, 数据格式化函数

格式化日期
<fmt:formatDate value=”${isoDate}” type=”both”/>

-定制数字格式时,# 表示按照默认格式来
:<fmt:formatNumber value=”1234567890″ type=”number” pattern=”#,#00.0#” />?

将字符串转化到正确的数字
<fmt:parseNumber type=”number” >123.02a</fmt:parseNumber>

2010十月1

Struts2.0标签语法

Struts2.0实践 评论关闭

得到action, request, session传来的数据
action? #property
<s:property value=”#session['key']“/>?? 或 <s:property value=”#session.key”/>?

<s:select list=”#request.allModules” listKey=”every” listValue=”name” name=”powerInfo.fid”/>

${sessionScope.key}?? //注:struts2.0标签中若用EI表达式,可能会得不到值

Struts2.0标签 实现了JSTL + EI? 功能

非UI
1,选择
<s:if test=”"></s:if>
<s:elseif test=”"></s:elseif>
<s:else></s:else>—–这3个标签一起使用,表示条件判断
<s:if test=”#session['key']==null”>?

2,循环
<s:iterator id=”book” value=”books” status=”index”>?

<!—输出当前元素的属性–>?
<s:property value=”property”/>?

<!—输出当前迭代元素的索引–>?
<s:property value=”#index.index”/>?

<!—输出当前迭代了几个元素–>?
<s:property value=”#index.count”/>??

<!—返回当前迭代元素的索引是否为奇数–>?
<s:property value=”#index.odd”/>??

<!—返回当前迭代元素的索引是否为偶数–>?
<s:property value=”#index.event”/>?

<!—返回当前元素是否为第一个–>?
<s:property value=”#index.first”/>?

<!—返回当前元素是否为最后一个–>?
<s:property value=”#index.last”/>?

</s:iterator>?
UI
1,URL
(1)? <s:url value=”editGadget.action”/>????????????? 区别于:<s:a href=”index.jsp”> <s:a href=”"></s:a>—–超链接,类似于html里的<a></a>

(2)?? <s:url action=”showBook”>
??? <s:param name=”author” value=”‘yeeku’” />
</s:url>

(3)?? <s:url id=”url” action=”preModifyCategoryName” includeParams=”get” namespace=”/category”>
??? <s:param name=”categoryId” value=”%{categoryId}”/>
?</s:url>

注:<s:actionerror/>—–如果action的errors有值那么显示出来
<s:actionmessage/>—–如果action的message有值那么显示出来

2,下拉框
(1) <s:combobox label=”请选择您喜欢的图书” theme=”css_xhtml” labelposition=”top”
list=”{‘Spring2.0宝典’ , ‘轻量级J2EE企业应用实战’ , ‘基于J2EE的Ajax宝典’}”
size=”20″ maxlength=”20″ name=”book”/>

与<s:select …/>标签不同的是,对于下面的下拉列表,无需指定listKey和listValue属性,因为此处的下拉列表,不再用于发送请求参数,而仅仅是用于辅助输入,因此该下拉列表的value没有任何意义
(2) Select
?List
<s:select name=”b” label=”请选择您喜欢的图书” labelposition=”top” multiple=”true”
??? list=”#bs.books”
??? listKey=”author”
??? listValue=”name”/>
Map
<s:select name=”b” label=”请选择您想选择出版日期” labelposition=”top”
??? list=”#{‘Spring2.0宝典’:’2006年10月’ , ‘轻量级J2EE企业应用实战’:’2007月4月’ , ‘基于J2EE的Ajax宝典’:’2007年6月’}”
??? listKey=”key”
??? listValue=”value”/>

<tr>
??? <td align=”center”>父权限</td>
??? <td align=”center”>
??? <s:select theme = “simple” label = “父权限”? list=”#request.allModules” listKey=”id” listValue=”name” name=”powerInfo.fid”/>
???? </td>???
?</tr>???????? //加theme = “simple”代表只生成一个简单的select,不用其自动生成<tr>之类, label就是在自动生成的情况下指示前td名称
????????????????? 注:listKey代表<option value>中的value值,?????? listValue 为<option>listValue</option>之间的数据

3,多个checkbox
(1) List
<s:checkboxlist name=”a” label=”请选择您喜欢的图书” labelposition=”top”
list=”{‘Spring2.0宝典’ , ‘轻量级J2EE企业应用实战’ , ‘基于J2EE的Ajax宝典’}”/>

<s:checkboxlist name=”b” label=”请选择您喜欢的图书” labelposition=”top”
list=”#bs.books”
listKey=”name”
listValue=”author”/>
(2)Map
<s:checkboxlist name=”b” label=”请选择您想选择出版日期” labelposition=”top”
list=”#{‘Spring2.0宝典’:’2006年10月’ , ‘轻量级J2EE企业应用实战’:’2007月4月’ , ‘基于J2EE的Ajax宝典’:’2007年6月’}”
listKey=”key”
listValue=”value”/>

4, s:radio生成多个单选框
<s:radio name=”c” label=”请选择您喜欢的图书” labelposition=”top”
list=”#bs.books”
listKey=”author”
listValue=”name”/>

5 s:optiontransferselect来生成可移动列表项的下拉列表框 , s:optgroup生成下拉选择框的选项组
s:updownselect生成可上下移动选项的下拉选择框 ,?????????????? s:doubleselect生成级联下拉列表框
s:tree和s:treenode标签生成静态树 ,

<s:tree label=”计算机图书” id=”book” theme=”ajax”
showRootGrid=”true” showGrid=”true” treeSelectedTopic=”treeSelected”>
<s:treenode theme=”ajax” label=”李刚” id=”yeeku”>
<s:treenode theme=”ajax” label=”Spring2.0宝典” id=”spring”/>
<s:treenode theme=”ajax” label=”轻量级J2EE企业应用实战” id=”lightweight”/>
<s:treenode theme=”ajax” label=”基于J2EE的Ajax宝典” id=”ajax”/>
</s:treenode>
<s:treenode theme=”ajax” label=”David” id=”David”>
<s:treenode theme=”ajax” label=”JavaScript: The Definitive Guide” id=”javascript”/>
</s:treenode>
<s:treenode theme=”ajax” label=”Johnson” id=”Johnson”>
<s:treenode theme=”ajax” label=”Expert One-on-One J2EE Design and Development” id=”j2ee”/>
</s:treenode>
</s:tree>

7, s:append标签拼接两个集合
<s:append id=”newList”>
<s:param value=”{‘Spring2.0宝典’,'轻量级J2EE企业应用实战’,'基于J2EE的Ajax宝典’}” />
<s:param value=”{‘新东方IT培训’, ‘东方标准职业教育’}” />
</s:append>

8, 使用s:generator生成集合
使用generator标签可以将指定字符串按指定分隔符分隔成多个子串,临时生成的多个子串可以使用iterator标签迭代输出。可以这样理解:generator将一个字符串转化成一个集合。在该标签的标签体内,整个临时生成的集合将位于ValueStack的顶端,但一旦该标签结束,该集合将被移出ValueStack。

<s:generator val=”‘Spring2.0宝典,轻量级J2EE企业应用实战,基于J2EE的Ajax宝典’”
separator=”,” id=”books” count=”2″/>
${books} 代表一个Iterator?? s:iterator>

<s:generator val=”‘Spring2.0宝典,轻量级J2EE企业应用实战,基于J2EE的Ajax宝典’” separator=”,”>
<s:iterator status=”st”>
<tr <s:if test=”#st.odd”>style=”background-color:#bbbbbb”</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</s:generator>

9,<s:datetimepicker></s:datetimepicker>—–日期输入框,
<s:file></s:file>—–文件上传
<s:form action=”"></s:form>—–获取相应form的值
<s:text name=”"></s:text>—–I18n文本信息
<s:textarea></s:textarea>—–文本域输入框
<s:textfield></s:textfield>—–文本输入框

2010十月1

调用系统命令 — Runtime

java知识点 评论关闭
类 Runtime
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 

应用程序不能创建自己的 Runtime 类实例。 

1, 打开文件:Runtime.getRuntime().exec("vs.net.exe");

2, 执行ping命令

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; 

public class JavaPing{ 

public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("ping 192.168.1.86");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  //获取执行结果
String line = "";
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

注:类 Process ,进程类
2010十月1

java的import

java知识点 评论关闭

两种import语句:

1, 单类型导入(single-type-import),例如import java.io.File;
按需类型导入(type-import-on-demand),例如 import java.io.*;
单类型导入比较好理解,仅仅导入一个public类或者接口。而对于按需类型导入,有人误解为导入一个包下的所有类,其实不然,看名字就知道,他只会按需导入,也就是说它并非导入整个包,而仅仅导入当前类需要使用的类。按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。

大型工程中,一般的书写建议是:
必须采用单类型引入,而且即使是同一个package下的,也要import,因为大型工程编译时间长。

2, import??? java.awt.*;??
import??? java.awt.event.*;??
…??
二者不一样,
java.awt.*没有包括java.awt.event.*,
*只能代表当前文件夹中所有类,不包括它的下一级文件夹中的类。

2010十月1

==

java知识点 评论关闭

在写代码的时候为了避免手误,把“==”(判等)敲成“=”(赋值)引起错误,推荐采用 if(常量 == 变量) 的模式。

2010十月1

读取XML文件 –dom4j

java知识点 评论关闭
一,, 读取文件
 File file=new File( filePath );
 SAXReader sar=new SAXReader();
 Document doc = sar.read(file);

二,操作数据

1.获取文档的根节点.
Element rootElm = document.getRootElement(); 

2.取得某节点的单个子节点.
Element memberElm=root.element("member");// "member"是节点名 

3.取得节点的文字
String text=memberElm.getText(); 也可以用:
String text=root.elementText("name"); 这个是取得根节点下的name字节点的文字.

4.取得某节点下名为"member"的所有字节点并进行遍历.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
} 

5.对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
} 

6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age"); 

7.设置节点文字.
ageElm.setText("29"); 

8.删除某节点.
parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点 

9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
contentElm.getText(); // 特别说明:获取节点的CDATA值与获取节点的值是一个方法
contentElm.clearContent(); //清除节点中的内容,CDATA亦可

三.属性相关.
1.取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=root.attribute("size");// 属性名name

2.取得属性的文字
String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname");
这个是取得根节点下name字节点的属性firstname的值.

3.遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}

4.设置某节点的属性和文字.
newMemberElm.addAttribute("name", "sitinspring");

5.设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");

6.删除某属性
Attribute attribute=root.attribute("size");// 属性名name
root.remove(attribute);

四.将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();

2.文档中含有中文,设置编码格式写入的形式.
     OutputFormat format = OutputFormat.createPrettyPrint();
     format.setEncoding("GBK");    // 指定XML编码
     XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);

     writer.write(document);
     writer.close();

五.字符串与XML的转换
1.将字符串转化为XML
String text = " sitinspring ";
Document document = DocumentHelper.parseText(text);

2.将文档或节点的XML转化为字符串.
     SAXReader reader = new SAXReader();
     Document   document = reader.read(new File("input.xml"));
     Element root=document.getRootElement();
     String docXmlText=document.asXML();
     String rootXmlText=root.asXML();
     Element memberElm=root.element("member");
     String memberXmlText=memberElm.asXML();
2010十月1

类的当前路径

java知识点 评论关闭
1 Test.class.getResource("");    当前类所在的地址
file:/E:/workspace/lj/WebRoot/WEB-INF/classes/com/lvjian/mail/

2 Test.class.getResource("/");  类的包所在的路径
file:/E:/workspace/lj/WebRoot/WEB-INF/classes/

//Class文件所在路径
3 new File("/").getAbsolutePath(); //根路径,相对于磁盘
E:\

4 System.getProperty("user.dir");  //工程目录             E:\workspace\lj
                                  在Tomcat服务器上在类中输出System.getProperty("user.dir");显示的%Tomcat_Home%/bin

得到classes下的配置文件在类中用:
String filePath = XML.class.getResource("/").toString();
filePath = filePath.substring( 5 )+ "lvjian.xml";
2010十月1

JAR文件编辑方式

java知识点 评论关闭

JAR文件就是将一些class文件打包,生成.jar文件,此操作类似于用winrar进行打包工作
JAR的操作: 可用winrar打开,直接增加,删除其中的文件

典型的用法是:j2ee 5.0 的mail.jar, activation.jar不完整,要删除之后导入正克的jar文件,就是通过用
??? winrar删除此文件,导入正确的文件完成的。

2010十月1

利用commons-email发送简单邮件

使用commons-email发邮件
commons-email是apache提供的一个开源的API,是对javamail的封装,因此在使用时要将mail.jar , activation.jar 加到 class path中,主要包括SimpleEmail,MultiPartEmail,HtmlEmail,EmailAttachment四个类。

注:当是j2se时因没有mail,activation包,故要加入这两个包,而对于j2ee.它本身自带这两个包,就不用再导入,可直接用。
要注意的一点是:j2ee5.0的mail.jar, activation.jar包中相关的类是不完整的,不能直接用,但若直接导入这两个包,又会造成
j2ee与导入的包冲突,解决方法是:找到j2ee.jar文件 ,用winrar打开,删除mail.jar, activation.jar,再导入 这两个包,就OK

SimpleEmail:发送简单的email,不能添加附件
MultiPartEmail:文本邮件,可以添加多个附件
HtmlEmail:HTML格式邮件,同时具有MultiPartEmail类所有“功能”
EmailAttchment:附件类,可以添加本地资源,也可以指定网络上资源,在发送时自动将网络上资源下载发送。

发送基本文本格式邮件:
==============
SimpleEmail email = new SimpleEmail();

//设置发送主机的服务器地址

email.setHostName(“smtp.gmail.com”);

//设置收件人邮箱

email.addTo(“cang521ying@yahoo.com.cn”,”cang521ying”);
//抄送:addCC 密送: addBcc CC:Carbon Copy BCC:Blind Carbon Copy Carbon( 碳,复本,复写本)

//发件人邮箱

email.setFrom(“goodasong@gmail.comm”,”goodasong”);

email.setDebug(true); //用来调试,打印出错误信息,正式运行时要注释掉
email.setSSL(true); //因用的是Gmail邮箱发送,故pop设置要符合Gmail的要求
email.setSmtpPort(465);

email.setAuthentication(“goodasong@gmail.com”, ““);

//设置邮件的主题

email.setSubject(“Hello, This is My First Email Application”);

//邮件正文消息
//最好进行转码,防止乱码,因要在网络中传输,而网络多用iso-8859-1发送,故要从gbk转成iso-8859-1
String content = “这是个测试!”;
content = new String(content.getBytes(“gbk”),”iso-8859-1″);
email.setMsg(content);

email.send();

各个邮箱的pop3的不同设置 ( 一般都要参考各个邮箱帮助中的outlook设置 )

1,在用某一品牌的邮箱发送邮件时首先要确保的是此邮箱的pop3开启
如Gmail的设置在:设置 — 转发和POP/IMAP – 针对所有邮件启用 POP(包括已经下载的邮件)
sina的设置在: 邮箱设置 — 账户 — 开启
163 需要VIP才可用outlook,意味着只有VIP账户才能进行发磅
注意记下各个smtp服务器名称,email.setHostName(“smtp.gmail.com”); sina 为 smtp.sina.com

2,在各个邮箱的帮助里看对outlook的设置,除了用户名,密码之外是否还要设置其它,像sina就不用,
而Gmail需要此服务器要求安全连接 (SSL) 启用
发送邮件服务器 (SMTP): 465 或 25

即:email.setSSL(true);
email.setSmtpPort(465);

2010十月1

使用commons-email发邮件

java知识点 评论关闭
 commons-email是apache提供的一个开源的API,是对javamail的封装,因此在使用时要将javamail.jar加到 class path中,主要包括SimpleEmail,MultiPartEmail,HtmlEmail,EmailAttachment四个类。

SimpleEmail:发送简单的email,不能添加附件
MultiPartEmail:文本邮件,可以添加多个附件
HtmlEmail:HTML格式邮件,同时具有MultiPartEmail类所有“功能”
EmailAttchment:附件类,可以添加本地资源,也可以指定网络上资源,在发送时自动将网络上资源下载发送。

发送基本文本格式邮件:
==============
SimpleEmail email = new SimpleEmail();
//smtp host
email.setHostName("mail.test.com");
//登陆邮件服务器的用户名和密码
email.setAuthentication("test","testpassword");
//接收人
email.addTo("jdoe@somewhere.org", "John Doe");
//发送人
email.setFrom("me@apache.org", "Me");
//标题
email.setSubject("Test message");
//邮件内容
email.setMsg("This is a simple test of commons-email");
//发送
email.send();

发送文本格式,带附件邮件:
==================
//附件,可以定义多个附件对象
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("e:\\1.pdf");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
//
MultiPartEmail email = new MultiPartEmail();
//smtp host
email.setHostName("mail.test.com");
//登陆邮件服务器的用户名和密码
email.setAuthentication("test","testpassword");
//接收人
email.addTo("jdoe@somewhere.org", "John Doe");
//发送人
email.setFrom("me@apache.org", "Me");
//标题
email.setSubject("Test message");
//邮件内容
email.setMsg("This is a simple test of commons-email");
//添加附件
email.attach(attachment);
//发送
email.send();

发送HTML格式带附件邮件:
=================
//附件,可以定义多个附件对象
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("e:\\1.pdf");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
//
HtmlEmail email = new HtmlEmail ();
//smtp host
email.setHostName("mail.test.com");
//登陆邮件服务器的用户名和密码
email.setAuthentication("test","testpassword");
//接收人
email.addTo("jdoe@somewhere.org", "John Doe");
//发送人
email.setFrom("me@apache.org", "Me");
//标题
email.setSubject("Test message");
//邮件内容
email.setHtmlMsg("This is a simple test of commons-email");
//添加附件
email.attach(attachment);
//发送
email.send();
2010十月1

集合操作出现 ConcurrentModificationException 异常

java知识点 评论关闭

?如:
?Iterator<PowerInfo> it = list.iterator();
??? ??? while( it.hasNext() ){
?????????? PowerInfo temp = it.next();
??? ??? ??? if ( it.next.getName().equals(“teset”) ){
??? ?? ??? ??? ?list.remove(? temp );
}

这样就会抛出ConcurrentModificationException 异常。 原因:

????? Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,故当索引指针往后移动的时候就找不到要迭代的对象,按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
?????? Iterator 在工作的时候是不允许被迭代的对象被改变的。可以使用 Iterator 本身的方法 remove() 来删除对象即:

?Iterator<PowerInfo> it = list.iterator();
??? ??? while( it.hasNext() ){
?????????? PowerInfo temp = it.next();
??? ??? ??? if ( it.next.getName().equals(“teset”) ){
??? ?? ??? ??? it.remove;????? //从迭代器指向的集合中移除迭代器返回的最后一个元素,即移除当前的元素。
}

2010十月1

读取服务器上的文件保存到本地

java知识点 评论关闭
不能直接用   File file = new File("http://127.0.0.1:8080/aa.txt") 来读取,因为网络上的传输协议为HTTP,与
        本地不同,要用URL来读取

       String output="";
        File file = new File("E://bb.txt");     

        URL MyURL = new URL("http://127.0.0.1:8080/aa.txt");
        URLConnection uc=MyURL.openConnection();
        uc.connect();

        InputStreamReader _Input=new InputStreamReader(uc.getInputStream(),"UTF-8");
        BufferedReader br=new BufferedReader(_Input);

        String s="";
        while((s=br.readLine())!=null){
        output+=s;
        }

        FileWriter fw=new FileWriter(file);
        fw.write(output);
        fw.flush();
        fw.close();
2010十月1

JAVA 泛型

java知识点 评论关闭
1, 在得到数据时不用再强制类型转换

      private Map powers = new HashMap();

    public void addModule( String moduleId, ModulePower mp ){
        powers.put( moduleId , mp );

    }

    public ModulePower findModuleById( String moduleId ){
        return powers.get( moduleId ); //自动识别为ModulePower
    }

2, 灵活

public interface List {

           void add(E x);

           Iterator iterator();

}

public interface Iterator {

           E next();

           boolean hasNext();

}
  // E 可为任意类型,可为除类型不一样,其它都一样的多个类提供模版,即提取出公共的类代码部分
2010十月1

类私有构造函数时初始化的进行

java知识点 评论关闭
public class Log{

    private int count;

   static{
        setCount( 1 );  //通过static构造程序块进行初始化,与匿名类的初始化一样.
    }

  private Log(){

  }

 public setCount( int count ){
    this.count = count;
}
}

注:
   static{
        setCount( 1 );  //通过static构造程序块进行初始化,与匿名类的初始化一样.
        System.out.println( "initialization...' );
        System.exit(0);  //即使没有main函数也能执行
    }
2010十月1

java split 对”.” 的处理

java知识点 评论关闭

如字符串:a.js
以“.”分割为字符串数组时,使用java String.split()的时候
必须经过转义后才能分割,单纯的以jsName.split(“.”);分割时,结构字符串数组长度为0;

而如果使用apche.commons.lang.StringUtils.split()方法 则可以直接使用,对比如下:
String jsName=”a.js”;
String[] splitStr = jsName.split(“\\.”);
splitStr = StringUtils.split(“a.js”, “.”)

2010十月1

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

java知识点 评论关闭

?★ =: 赋值运算符,在编译器将右边的表达式结果计算出来后,和左边的变量类型比较精度,如果左边的变量精度低于右边的结果的精度,编译器会显式的报错,告诉程序员去强制转型。(所以s1 = s1 + 1出错)最后将表达式的结果复制到变量所在的内存区。
= 是会在把后面的数值赋值到前面的变量时检测类型是否相同( 非自动强制转换!)如果是高精度到低精度的,需要报错,告诉程序员会loss of data

★ +=:暂且称之为**运算符,编译器自动隐式直接将+=运算符后面的操作数强制装换为前面变量的类型,然后在变量所在的内存区上直接根据右边的操作数修改左边变量内存存储的二进制数值(所以 s += 1不报错)最后达到和赋值运算符相同的目的。与前者相比,由于后者是位操作,效率也较前者高。+= 会把后面的数值自动强制转换为前面的类型,不管类型谁大谁小,然后在那快内存上直接修改数值