??xml version="1.0" encoding="utf-8" standalone="yes"?> 1 getCurrentSession创徏的session会和l定到当前线E?而openSession每次创徏新的session?/span> 2 getCurrentSession创徏的线E会在事务回滚或事物提交后自动关?而openSession必须手动关闭 q里getCurrentSession本地事务(本地事务:jdbc)?要在配置文g里进行如下设|?/span> * 如果使用的是本地事务Qjdbc事务Q?br />
<property name="hibernate.current_session_context_class">thread</property> getCurrentSession () 在事务结束之前用当前的session 在一个应用程序中Q如果DAO 层用Spring 的hibernate 模板Q通过Spring 来控制session 的生命周期,则首选getCurrentSession ()?/span> 使用Hibernate的大多数应用E序需要某UŞ式的“上下文相关的” sessionQ特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用E序而言Q要Z么是l成q种“上下?#8221;下一个定义通常 是困隄Q不同的上下文对“当前”q个概念定义了不同的范围。在3.0版本之前Q用Hibernate的程序要么采用自行编写的Z ThreadLocal的上下文sessionQ要么采用HibernateUtilq样的辅助类Q要么采用第三方框架Q比如Spring或Pico)Q?它们提供了基于代?proxy)或者基于拦截器(interception)的上下文相关session? ?.0.1版本开 始,Hibernate增加了SessionFactory.getCurrentSession()Ҏ。一开始,它假定了采用JTA事务QJTA事务 定义了当前session的范围和上下?scope and context)。Hibernate开发团队坚信,因ؓ有好几个独立的JTA TransactionManager实现E_可用Q不论是否被部vC个J2EE容器中,大多?假若不是所有的Q应用程序都应该采用JTA事务理?Zq一点,采用JTA的上下文相关session可以满你一切需要? 更好的是Q从3.1开 始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩展接?(org.hibernate.context.CurrentSessionContext)和新的配|参?(hibernate.current_session_context_class)Q以便对什么是“当前session”的范围和上下?scope and context)的定义进行拔插? 请参?org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契U的详细讨论。它定义 了单一的方法,currentSession()Q特定的实现用它来负责跟t当前的上下文session。Hibernate内置了此接口的两U实现? org.hibernate.context.JTASessionContext - 当前sessionҎJTA来跟t和界定。这和以前的仅支持JTA的方法是完全一L。详情请参阅Javadoc? org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线E来跟踪和界定。详情也请参阅Javadoc? q?两种实现都提供了“每数据库事务对应一个session”的编E模型,也称作每ơ请求一个session。Hibernate session的v始和l结由数据库事务的生存来控制。假若你采用自行~写代码来管理事务(比如Q在Ua的J2SE,或?JTA/UserTransaction/BMTQ,你用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行Q何事务或 session理操作。请参阅W?11 ?事务和ƈ发一节来阅读更多的内容和CZ代码? hibernate.current_session_context_class 配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,Z向下兼容Q如果未 配置此参敎ͼ但是存在org.hibernate.transaction.TransactionManagerLookup的配 |,Hibernate会采用org.hibernate.context.JTASessionContext。一般而言Q此参数的值指明了要用的?现类的全名,但那两个内置的实现可以用简写,?jta"?thread"?/span> 1、getCurrentSession()与openSession()的区别? * 采用getCurrentSession()创徏的session会绑定到当前U程中,而采用openSession() 利于ThreadLocal模式理Session public static final ThreadLocal session =new ThreadLocal(); public static final SessionFactory sessionFactory; public static Session currentSession() throws HibernateException { public static void closeSession() throws HibernateException { package com.hibernate; import java.util.Date; import org.hibernate.Session; public class HibernateIDTest { openSession() ?getCurrentSession() 有何不同和关联呢Q? ?SessionFactory 启动的时候, Hibernate 会根据配|创建相应的 CurrentSessionContext Q在 getCurrentSession() 被调用的时候,实际被执行的Ҏ?CurrentSessionContext.currentSession() 。在 currentSession() 执行Ӟ如果当前 Session 为空Q?currentSession 会调?SessionFactory ?openSession 。所?getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法?br />
* 如果使用的是全局事务Qjta事务Q?br />
<property name="hibernate.current_session_context_class">jta</property>
openSession() 每次重新建立一个新的session
创徏的session则不?br />
* 采用getCurrentSession()创徏的session在commit或rollback时会自动关闭Q而采用openSession()
创徏的session必须手动关闭
2、用getCurrentSession()需要在hibernate.cfg.xml文g中加入如下配|:
* 如果使用的是本地事务Qjdbc事务Q?br />
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务Qjta事务Q?br />
<property name="hibernate.current_session_context_class">jta</property>
早在Java1.2推出之时QJavaq_中就引入了一个新的支持:java.lang.ThreadLocalQ给我们在编写多U程E序
时提供了一U新的选择。ThreadLocal是什么呢Q其实ThreadLocalq是一个线E的本地实现版本Q它q不是一个ThreadQ?br />
而是thread local variable(U程局部变?。也许把它命名ؓThreadLocalVar更加合适。线E局部变?ThreadLocal)
其实的功用非常简单,是为每一个用某变量的线E都提供一个该变量值的副本Q是每一个线E都可以独立地改变自q副本Q?br />
而不会和其它U程的副本冲H。从U程的角度看Q就好像每一个线E都完全拥有一个该变量?
ThreadLocal是如何做Cؓ每一个线E维护变量的副本的呢Q其实实现的思\很简单,在ThreadLocalcM有一个MapQ?br />
用于存储每一个线E的变量的副本。比如下面的CZ实现(Z单,没有考虑集合的泛?Q?
public class HibernateUtil {
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
Session s = session.get();
if(s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
Session s = session.get();
if(s != null) {
s.close();
}
session.set(null);
}
}
在这里比较了下getCurrentSession()是否是用的是同一个session...............
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass() {
try{
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}
@Test
public void testTeacherSave() {
System.out.println("------------");
Teacher t = new Teacher();
t.setId(1);
t.setName("t1");
t.setTitle("middle");
t.setBirthDate(new Date());
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
Session session2 = sessionFactory.getCurrentSession();
System.out.println("比较"+(session.hashCode()==session2.hashCode()));
}
}
执行之后不的到结果是 session.hashCode()==session2.hashCode()q两个只是false的,也就是说Q在事务l束之后getCuttentSession 也是创徏了新的session。。。。。?/span>
]]>
1Q服务器~少中文字体Q这多发生在Hp{unix操作pȝ上,解决的方法就是下载可用字体库到系l中Q?br />
有h也提出在Windows上生图片在传回到UnixL上的Ҏ?br />
2QY件版本问题,jfreechart-1.0.10有h说没有问题,但jfreechart-1.0.11?3都有问题Q我用的最新的jfreechart-1.0.13不做讄是有问题的?br />
I其原因Q是它代码的内部讄的字体有问题.
其下是具体的解决办法Q?br />
JFreeChart是开放源代码站点SourceForge.net上的一个JAVA目Q它主要用来各种各样的图表,q些图表包括Q饼图、柱状图(?通柱状图以及堆栈q?、线图、区域图、分布图、合图、甘特图以及一些A表盘{等。这些不同式L图表基本上可以满目前的要求。ؓ了减篇q本文主 要介l前面三U类型的图表Q读者可以触cL通去开发其他样式的图表?/p>
对于饼图而言Q数据集的获取用的不是同一个数据集c,另外饼图不支持同一个类别的目中还有子目q样的数据。我们只l出创徏饼图的代码,至于写图表到一个文件则与柱状图一_无需重复.. package com.dr.demo; import org.jfree.chart.ChartFactory; public class SalesCountServlet { protected static void doGet() { FileOutputStream fos_jpg = null;
q里有点W者在开发中遇见的问题需要注意的?/span>Q在使用Eclipse开发的时候会报一个莫名其妙的错误Q错误可能指向某个类文g的第一行。遇到这L问题一般是因ؓ没有把Jcommon的jar包设|到目的类路径中的~故。具体的原因不祥?br />
实例代码如下Q?br />
import java.awt.Color;
import java.awt.Font;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
/**
*
* @author Ҏ?br />
* @date 2010-2-25
* @ClassName PolyLine.java
* @Email 289153044@qq.com
* @param 饼图
* @param
*/
System.out.println("图表已经建立Q?);
CategoryDataset dataset = getDataSet();
String fileName = "SalesCount.jpg";//文g名称
JFreeChart chart = ChartFactory.createBarChart3D("产品销量图", // 图表标题
"产品", // 目录轴的昄标签
"销?, // 数Du的显C标{?br />
dataset, // 数据?br />
PlotOrientation.VERTICAL, // 图表方向Q水q뀁垂?br />
true, // 是否昄图例(对于单的q囑ֿLfalse)
false, // 是否生成工具
false // 是否生成URL链接
);
configFont(chart);//讄中文格式
try {
String statImagePath = "d:";//存放文g的\?br />
try {
fos_jpg = new FileOutputStream(statImagePath+ fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
ChartUtilities.writeChartAsJPEG(fos_jpg, 0.5f, chart, 400, 300,null);
} catch (IOException e) {
e.printStackTrace();
}
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void configFont(JFreeChart chart){
// 配置字体
Font xfont = new Font("宋体",Font.PLAIN,12) ;// X?nbsp;
Font yfont = new Font("宋体",Font.PLAIN,12) ;// Y?nbsp;
Font kfont = new Font("宋体",Font.PLAIN,12) ;// 底部
Font titleFont = new Font("隶书", Font.BOLD , 25) ; // 囄标题
CategoryPlot plot = chart.getCategoryPlot();// 囑Ş的绘制结构对?nbsp;
// 囄标题
chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));
// 底部
chart.getLegend().setItemFont(kfont);
// X ?nbsp;
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标?nbsp;
domainAxis.setTickLabelFont(xfont);// 轴数?nbsp;
domainAxis.setTickLabelPaint(Color.BLUE) ; // 字体颜色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横u上的label斜显C?nbsp;
// Y ?nbsp;
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE) ; // 字体颜色
rangeAxis.setTickLabelFont(yfont);
}
private static CategoryDataset getDataSet() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(20, "销售图?, "Ҏ");
dataset.addValue(20, "销售图?, "?);
dataset.addValue(30, "销售图?, "香蕉");
dataset.addValue(40, "销售图?, "葡萄");
dataset.addValue(50, "销售图?, "桔子");
return dataset;
}
public static void main(String args[]){
doGet();
}
}
package com.dr.service;
import com.dr.DAO.ProductDAO;
import com.dr.model.Product;
public class ProductService {
private ProductDAO productDAO;
public void add(Product product){
productDAO.save(product);
}
public ProductService(ProductDAO productDAO){
super();
System.out.println("ProductServic :ProductService");
this.productDAO = productDAO;
}
}
package com.dr.DAO;
import com.dr.model.Product;
public interface ProductDAO {
public void save(Product product);
}
package com.dr.DAO.impl;
import com.dr.DAO.ProductDAO;
import com.dr.model.Product;
public class ProductDAOImpl implements ProductDAO {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("ProductDAOImple :setName");
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
System.out.println("ProductDAOImpl :setId");
this.id = id;
}
public void save(Product product) {
//Hibernate
//JDBC
//XML
//NetWork
System.out.println("ProductDAOImpl :save :product saved!");
this.toString();
}
public String toString(){
System.out.println("id:"+id+"|name:"+name);
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="p" class="com.dr.DAO.impl.ProductDAOImpl">
<!--采用 setter()Ҏ依赖注入-->
<property name="name" value="11"></property>
<property name="id" value="22"></property>
</bean>
<bean id="productService" class="com.dr.service.ProductService">
<constructor-arg>
<ref bean="p"/>
</constructor-arg>
</bean>
</beans>
package com.dr.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dr.model.Product;
import com.dr.service.ProductService;
//Dependency Injection 依赖注入
//Inverse of Control 控制反{
public class ProductServiceTest {
@Test
public void testAdd() throws Exception {
//实例化应用上下文QXmlc\径应用上下文
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//getBean() 所得到得对象是Objectcd的,所有在此必d制{换。。?br />
ProductService service = (ProductService) ctx.getBean("productService");
Product product = new Product();
product.toString();
product.setId(20);
product.setName("Ҏ");
service.add(product);
}
}
package com.dr.demo2.servlet;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.log4j.Logger;
public class SessionCounter implements HttpSessionListener,
ServletRequestListener {
private static Logger log = Logger.getLogger(SessionCounter.class);
private static final String CONTENT_TYPE = "text/html; charset=GBK";
private static int activeSessions = 0;// 当前zd的h?br />
private HttpServletRequest request;
private static ArrayList list = new ArrayList();// 用来存放不同ip的地址
public void init() throws ServletException {
log.info("SessionCounter init!");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
log.info("SessionCounter doGet!");
response.setContentType(CONTENT_TYPE);
HttpSession session = request.getSession();
}
public void destroy() {
log.info("SessionCounter destroy!");
}
public void requestDestroyed(ServletRequestEvent event) {
// To change body of implemented methods use File | Settings | File
// Templates.
log.info("SessionCounter requestDestroyed!");
}
public void requestInitialized(ServletRequestEvent sre) {
request = (HttpServletRequest) sre.getServletRequest();
log.info("SessionCounter requestInitialized!");
}
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
log.info("SessionCounter sessionCreater!");
String sessionId = httpSessionEvent.getSession().getId();
Timestamp createTime = new Timestamp(System.currentTimeMillis());
String loginIp = request.getRemoteAddr();
boolean rs = true;
if (list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
if (loginIp.equals(list.get(i))) {
rs = false;
}
}
}
if (rs) { // 如果队列中存在相同的IP 则SESSION不增?br />
list.add(loginIp);
log.info("ipList队列新增ip: " + loginIp);
activeSessions++;
log.info("新增SESSION,sessionId = " + sessionId + "; createTime = "
+ createTime + "; loginIp = " + loginIp + "; 当前总SESSIONgؓ "
+ activeSessions);
}
}
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
log.info("SessionCounter sessionDestroyed!");
String sessionId = httpSessionEvent.getSession().getId();
Timestamp overTime = new Timestamp(System.currentTimeMillis());
String loginIp = request.getRemoteAddr();
if (activeSessions > 0) {
if (list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
if (loginIp.equals(list.get(i))) {
list.remove(i);
log.info("ipList队列U除ip: " + loginIp);
}
}
}
activeSessions--; // 在用户销毁的时?从队列中t出q个IP
log.info("销毁SESSION,sessionId = " + sessionId + "; overTime = "
+ overTime + "; loginIp = " + loginIp + "; 当前总SESSIONgؓ "
+ activeSessions);
}
}
public static int getActiveSessions() {
log.info("SessionCounter getActiveSessions!");
return activeSessions;
}
public void setActiveSessions(int i) {
log.info("SessionCounter setActiveSessions!");
activeSessions = i;
}
}
jsp 部分代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'online.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%@ page import= "com.dr.demo2.servlet.SessionCounter" %>
在线Q?<%= SessionCounter.getActiveSessions() %>?nbsp;
</body>
</html>
启动tomcat ,在浏览器中输入:http://127.0.0.1:8080/OnlineCount/online.jsp
执行效果如下Q?br />
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.126.com" />
<property name="port" value="25" />
<property name="username" value="avasd@126.com" />
<property name="password" value="你的密码" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
</beans>
在此用纯Java代码做了个小demo来发送电子邮Ӟ
package com.cmcc.mail;
/**
* 发送邮仉要用的基本信息
*/
import java.util.Properties;
public class MailSenderInfo {
// 发送邮件的服务器的IP和端?nbsp;
private String mailServerHost;
private String mailServerPort = "25";
// 邮g发送者的地址
private String fromAddress;
// 邮g接收者的地址
private String toAddress;
// 登陆邮g发送服务器的用户名和密?nbsp;
private String userName;
private String password;
// 是否需要n份验?nbsp;
private boolean validate = false;
// 邮g主题
private String subject;
// 邮g的文本内?nbsp;
private String content;
// 邮g附g的文件名
private String[] attachFileNames;
/**
* 获得邮g会话属?nbsp;
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
public String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String textContent) {
this.content = textContent;
}
}
package com.cmcc.mail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* 单邮Ӟ不带附g的邮Ӟ发送器
*/
public class SimpleMailSender {
/**
* 以文本格式发送邮?nbsp;
* @param mailInfo 待发送的邮g的信?nbsp;
*/
public boolean sendTextMail(MailSenderInfo mailInfo) {
// 判断是否需要n份认?nbsp;
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要n份认证,则创Z个密码验证器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// Ҏ邮g会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// Ҏsession创徏一个邮件消?nbsp;
Message mailMessage = new MimeMessage(sendMailSession);
// 创徏邮g发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 讄邮g消息的发送?nbsp;
mailMessage.setFrom(from);
// 创徏邮g的接收者地址Qƈ讄到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 讄邮g消息的主?nbsp;
mailMessage.setSubject(mailInfo.getSubject());
// 讄邮g消息发送的旉
mailMessage.setSentDate(new Date());
// 讄邮g消息的主要内?nbsp;
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 发送邮?nbsp;
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
/**
* 以HTML格式发送邮?nbsp;
* @param mailInfo 待发送的邮g信息
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo){
// 判断是否需要n份认?nbsp;
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
//如果需要n份认证,则创Z个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// Ҏ邮g会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// Ҏsession创徏一个邮件消?nbsp;
Message mailMessage = new MimeMessage(sendMailSession);
// 创徏邮g发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 讄邮g消息的发送?nbsp;
mailMessage.setFrom(from);
// 创徏邮g的接收者地址Qƈ讄到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性表C接收者的cd为TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 讄邮g消息的主?nbsp;
mailMessage.setSubject(mailInfo.getSubject());
// 讄邮g消息发送的旉
mailMessage.setSentDate(new Date());
// MiniMultipartcL一个容器类Q包含MimeBodyPartcd的对?nbsp;
Multipart mainPart = new MimeMultipart();
// 创徏一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 讄HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// MiniMultipart对象讄为邮件内?nbsp;
mailMessage.setContent(mainPart);
// 发送邮?nbsp;
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
}
试E序如下Q?br />
package com.cmcc.mail;
/*****************************************************
*
* @author Ҏ?nbsp;*
* @since 2011-3-3 *
*****************************************************/
public class TestMail {
public static void main(String[] args){
//q个cM要是讄邮g
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.126.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
mailInfo.setUserName("邮箱号@126.com");
mailInfo.setPassword("邮箱密码");//您的邮箱密码
mailInfo.setFromAddress("good_hans@126.com");
mailInfo.setToAddress("656426515@qq.com");
mailInfo.setSubject("计算中心北调N知?);
String content = "";
String header = "敬?+"aa 老师:\n"+
"您好Q\n"+
"q是一计中心(北)排课q_自动l您发送的机房评通知单,h按照下表的相应的旉通知学生到相应的机房上课\n"+
"谢谢您的支持Q您的满意是我们计算中心最大的快乐Q\n"+
"如果您对课表有Q何疑问,h拨打0315-2792027\n";
content += "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"+
"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
"<head>\n" +
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n" +
// "<!--[if IE]><link href='/css/fkie.css' rel='stylesheet' type='text/css' media='all' /><![endif]-->\n" +
"<style type=\"text/css\">\n" +
"<!--\n"+
"html{border:0;height:100%;border:0;}\n" +
"body{margin:0;padding:0;height:100%;font:12px/120% Arial, Helvetica, sans-serif; text-align:left;}\n" +
"#main{ padding:15px 25px 15px 10px;}\n" +
".tables{ background:#b2bac5; width:100%; margin:1px 0;}\n"+
".tables caption{background:#e5e8ed; padding:1px 0 0 0; _border-bottom:solid 3px #fff; height:26px;}\n"+
".tables th{text-align:center;background:#eef7e2; color:#016bb7; font-weight: normal; line-height:22px;}\n"+
".tables tr{ background:#fff;}\n"+
".tables tr td{line-height:22px;}\n"+
".area-contrl{background:#e5e8ed; padding:1px 0 0 0; _border-bottom:solid 3px #fff; height:26px;}\n" +
"-->\n"+
"</style>\n" +
"</head>\n" +
"<body>\n" +
"<div id=\"main\">\n" +
"<div class=\"area-contrl\">\n" +
"<table class='tables' border='0' cellpadding='3' cellspacing='1'><tr><th width='35'>周次</th><th width='35'>星期</th><th width='35'>讲次</th><th width='180'>机房</th><th width='50'>人数</th><th width='100'>任课教师</th><th width='200'>班</th><th width='300'>评名称</th></tr>\n"
+"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>\n"
+"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>\n"
+"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>\n"
+"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>";
content += "</table></div></div></body></html>";
System.out.println(content);
mailInfo.setContent(content);
//q个cM要来发送邮?nbsp;
SimpleMailSender sms = new SimpleMailSender();
// sms.sendTextMail(mailInfo);//发送文体格?nbsp;
sms.sendHtmlMail(mailInfo);//发送html格式
}
}
废话说Q直接进入正题,我们先来看一些简单的ҎQ这些方法都是对jQuery.ajax()q行装以方便我们用的ҎQ当Ӟ如果要处理复杂的逻辑Q还是需要用到jQuery.ajax()?q个后面会说?.
1. load( url, [data], [callback] ) Q蝲入远E?HTML 文g代码q插入至 DOM 中?/span>
url (String) : h的HTML늚URL地址?
data (Map) : (可选参? 发送至服务器的 key/value 数据?
callback (Callback) : (可选参? h完成?不需要是success?/span>)的回调函数?
q个Ҏ默认使用 GET 方式来传递的Q如果[data]参数有传递数据进去,׃自动转换为POST方式的。jQuery 1.2 中,可以指定选择W,来筛选蝲入的 HTML 文档QDOM 中将仅插入筛选出?HTML 代码。语法Ş?"url #some > selector"?/p>
q个Ҏ可以很方便的动态加载一些HTML文gQ例如表单?br />
2. jQuery.get( url, [data], [callback] )Q用GET方式来进行异步请?/span>
参数Q?
url (String) : 发送请求的URL地址.
data (Map) : (可? 要发送给服务器的数据Q以 Key/value 的键值对形式表示Q会做ؓQueryString附加到请求URL中?
callback (Function) : (可? 载入成功时回调函?只有当Response的返回状态是success才是调用该方??/p>
q是一个简单的 GET h功能以取代复?$.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函敎ͼ请?$.ajax。示例代码:
$.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){ //q回?data 可以?xmlDoc, jsonObj, html, text, {等. this; // 在这里this指向的是Ajaxh的选项配置信息Q请参考下?/span> alert(data); //alert(textStatus);//h状态:successQerror{等?br /> 当然q里捕捉不到errorQ因为error的时候根本不会运行该回调函数 //alert(this); });
CZ代码Q?/pre>$.getJSON("servlet/TableServlet?flag=query", "", function(response){
$.each(response,function(i){
sel.src.add({id: response[i].id, name: response[i].name, address: response[i].address});
})
sel.render();
});
});
下面我做了一?利用jQuery Ajax 做了以小的Demo;
其中java 部分主要代码Q?br />package com.bx.web.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONArray;
import com.bx.dao.impl.HibernateUserDAO;
import com.bx.hibernate.User;public class TableServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 5469871499359894890L;User user=new User();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {String flag=request.getParameter("flag");
if(flag!=null&&"flag".equals("flag")){
query(request,response);
}
}public void query(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HibernateUserDAO test=new HibernateUserDAO();
List<User> list = test.getUserList();
for(User userlist:list){
System.out.println("Table UserName+++"+userlist.getName()+
"......Hibernate Dbconfig....User.Address"+userlist.getAddress());
}
JSONArray jr=JSONArray.fromObject(list);
String jsonUser=jr.toString();
PrintWriter out = response.getWriter();
out.print(jsonUser);
out.flush();
out.close();
}
}
jsp中的代码如下Q?br />
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>tabledemo</title>
<link href="css/style.css" type="text/css" rel="stylesheet"/>
<script src="scripts/jquery.js" type="text/javascript"></script>
<script src="scripts/PagerView.js" type="text/javascript"></script>
<script src="scripts/SelectorView.js" type="text/javascript"></script>
<script src="scripts/SortView.js" type="text/javascript"></script>
<script src="scripts/TableView.js" type="text/javascript"></script>
<script type="text/javascript">
$ (document).ready (function() {
var sel = new SelectorView('sel_div');
sel.src.header = {
id : '~号',
name : '姓名',
address: '地址'
};
sel.dst.header = {
id : '~号',
name: '姓名',
address: '地址'
};
sel.src.dataKey = 'id';
sel.src.title = '可?;
sel.dst.dataKey = 'id';
sel.dst.title = '已?;
sel.render();
$.getJSON("servlet/TableServlet?flag=query", "", function(response){
$.each(response,function(i){
sel.src.add({id: response[i].id, name: response[i].name, address: response[i].address});
})
sel.render();
});
});
</script>
</head>
<body>
<div id="sel_div"></div>
</body>
</html>
最后在览器URL中输入:http://localhost:8080/TableWebProject/pagerList.jspq行l果
![]()
一些资?/span>
一个jQuery的Ajax Form表单插gQ?a style="background-color: rgb(255,255,216)" >http://www.malsup.com/jquery/form/
一个专门生成Loading囄的站点:http://ajaxload.info/ 大家觉得那些Loading比较炫的可以在这里跟帖晒一下,方便大家取用Q嘎?
]]>
XMLHttpRequest 对象
通过使用 XMLHttpRequest 对象Q?/font>web 开发者可以做到在面已加载后从服务器更新面Q?/font>
1. onreadystatechange 属?/font>
onreadystatechange 属性存有处理服务器响应的函数。下面的代码定义一个空的函敎ͼ可同时对 onreadystatechange 属性进行设|:
2. readyState 属?/font>
readyState 属性存有服务器响应的状态信息。每?nbsp;readyState 改变Ӟonreadystatechange 函数׃被执行?br />
<html>
<head>
<title>select city</title>
</head>
<script type="text/javascript">
function getResult(stateVal) {
alert(stateVal);
var url = "selectCityServlet?state="+stateVal;
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
}else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if(req){
req.open("GET",url, true);
req.onreadystatechange = complete;
req.send(null);
}
}
function complete(){
if (req.readyState == 4) {
if (req.status == 200) {
var city = req.responseXML.getElementsByTagName("city");
var str=new Array();
for(var i=0;i<city.length;i++){
str[i]=city[i].firstChild.data;
}
buildSelect(str,document.getElementById("city"));
}
}
}
function buildSelect(str,sel) {
for(var i=0;i<str.length;i++) {
sel.options[sel.options.length]=new Option(str[i],str[i]);
}
}
</script>
<body>
<select name="state" onChange="getResult(this.value)">
<option value="">Select</option>
<option value="zj">江</option>
<option value="zs">江苏</option>
</select>
<select id="city">
<option value="">CITY</option>
</select>
</body>
</html>
public class SelectCityServlet extends HttpServlet {
public SelectCityServlet() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Hello | " + request.getParameter("state"));
response.setContentType("text/xml");
response.setCharacterEncoding("utf-8");
response.setHeader("Cache-Control", "no-cache");
String state = request.getParameter("state");
StringBuffer sb=new StringBuffer("<state>");
if ("zj".equals(state)){
sb.append("<city>hangzhou</city><city>huzhou</city>");
} else if("zs".equals(state)){
sb.append("<city>nanjing</city><city>yangzhou</city><city>suzhou</city>");
} else if("hb".equals(state)){
sb.append("<city>tangshan</city><city>handan</city>");
}
sb.append("</state>");
System.out.println(sb);
PrintWriter out=response.getWriter();
out.write(sb.toString());
out.close();
}
}
package com.bx.jstl;
public class User {
private int id; //声明了两l属性;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.bx.JSServlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bx.jstl.User;
public class JSTLServlet extends HttpServlet{
public void doGet(HttpServletRequest request , HttpServletResponse response)
throws IOException , ServletException
{
List<User> list = new ArrayList<User>();
for(int i = 0 ; i < 8 ; i++)
{
User u = new User();
u.setId(i);
u.setName("name"+i);
list.add(u);
}
request.setAttribute("UserList", list);
request.getRequestDispatcher("/c_forEach.jsp").forward(request, response);
}
}
现在我们应该来配|WEB.xml了,q是每个Web目都做的一步,如下所C:
<servlet>
<servlet-name>JSTLServlet</servlet-name>
<servlet-class>com.bx.JSServlet.JSTLServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSTLServlet</servlet-name>
<url-pattern>/jstl</url-pattern>
</servlet-mapping>
下面我们建立一个c_forEach.jspQ在其body中的~写代码如下Q?br />
<table>
<tr><th>ID</th><th>index</th><th>count</th><th>isFirst?</th><th>isLast</th></tr>
<c:forEach var="user" items="${UserList}" varStatus="status">
<tr>
<td>
${user.id}
</td>
<td>
${user.name}
</td>
<td>
${status.index}
</td>
<td>
${status.count}
</td>
<td>
${status.first}
</td>
<td>
${status.last}
</td>
</tr>
</c:forEach>
</table>
现在我们开启comcat q行此项目,在浏览器中输入:
http://localhost:8080/JSP_JSTL_Project/jstl
得到|页为: