JavaWeb项目开发案例精粹-第4章博客网站系统-005action层
1.
package com.sanqing.action; import java.util.Date;
import java.util.Map; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.Article;
import com.sanqing.service.ArticleService; public class AddArticle extends ActionSupport {
private String title;
private String content;
private ArticleService articleService; public ArticleService getArticleService() {
return articleService;
}
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String execute() throws Exception {
Map session = ActionContext.getContext().getSession();
String username = (String) session.get("username"); //封装一个PO类的对象
Article article = new Article();
article.setTitle(title);
article.setContent(content);
article.setUsername(username);
article.setDate(new Date());
article.setHasread(0);
articleService.addArticle(article);
return this.SUCCESS;
}
}
2.
package com.sanqing.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.Critique;
import com.sanqing.service.CritiqueService; public class AddCritique extends ActionSupport {
private CritiqueService critiqueService;
private int id;
private String content; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public CritiqueService getCritiqueService() {
return critiqueService;
} public void setCritiqueService(CritiqueService critiqueService) {
this.critiqueService = critiqueService;
} public String execute() throws Exception {
Map session = ActionContext.getContext().getSession();
String username = (String) session.get("username");
Critique critique = new Critique();
if(username == null || "".equals(username)) {
critique.setUsername("匿名");
} else {
critique.setUsername(username);
}
critique.setAId(id);
critique.setContent(content); // 保存评论
this.critiqueService.addCritique(critique); return this.SUCCESS;
} }
3.EditBlogInfo-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<validator type="requiredstring">
<param name="fieldName">blogtitle</param>
<param name="trim">true</param>
<message>必须输入博客标题</message>
</validator> <validator type="regex">
<param name="fieldName">blogtitle</param>
<param name="expression"><![CDATA[([\u4e00-\u9fa5,a-z,A-Z,0-9]{4,20})]]></param>
<message>博客标题长度必须为4至20之间</message>
</validator> <validator type="requiredstring">
<param name="fieldName">idiograph</param>
<param name="trim">true</param>
<message>必须输入个性签名</message>
</validator> <validator type="regex">
<param name="fieldName">idiograph</param>
<param name="expression"><![CDATA[([\u4e00-\u9fa5,a-z,A-Z,0-9]{4,20})]]></param>
<message>个性签名长度必须为4至20之间</message>
</validator>
</validators>
4.
package com.sanqing.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.BlogInfo;
import com.sanqing.service.BlogInfoService; public class EditBlogInfo extends ActionSupport {
private String blogtitle;
private String idiograph;
private BlogInfoService blogInfoService; public BlogInfoService getBlogInfoService() {
return blogInfoService;
} public void setBlogInfoService(BlogInfoService blogInfoService) {
this.blogInfoService = blogInfoService;
} public String getBlogtitle() {
return blogtitle;
} public void setBlogtitle(String blogtitle) {
this.blogtitle = blogtitle;
} public String getIdiograph() {
return idiograph;
} public void setIdiograph(String idiograph) {
this.idiograph = idiograph;
} public String execute() throws Exception {
// //获得request
// HttpServletRequest request = ServletActionContext.getRequest();
// //获得session
// HttpSession session =request.getSession();
// //获得username
// String username = (String) session.getAttribute("username"); Map session = ActionContext.getContext().getSession();
String username = (String) session.get("username"); BlogInfo blogInfo = new BlogInfo();
//设置用户名
blogInfo.setUsername(username);
//设置博客标题
blogInfo.setBlogtitle(blogtitle);
//设置个性签名
blogInfo.setIdiograph(idiograph);
//调用业务逻辑组件来完成设置
blogInfoService.setBlogInfo(blogInfo); return this.SUCCESS;
} }
5.
package com.sanqing.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.BlogInfo;
import com.sanqing.service.BlogInfoService; public class GetBlogInfo extends ActionSupport { private BlogInfoService blogInfoService; public BlogInfoService getBlogInfoService() {
return blogInfoService;
} public void setBlogInfoService(BlogInfoService blogInfoService) {
this.blogInfoService = blogInfoService;
} public String execute() throws Exception {
//获得usrname
Map session = ActionContext.getContext().getSession();
String username = (String) session.get("username"); //通过业务逻辑组件来查询
BlogInfo bloginfo = blogInfoService.getBlogInfo(username); if(bloginfo != null) {
session.put("blogtitle", bloginfo.getBlogtitle());
session.put("idiograph", bloginfo.getIdiograph());
}
return this.SUCCESS;
}
}
6.
package com.sanqing.action; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.User;
import com.sanqing.service.UserService; public class Login extends ActionSupport {
private String username;
private String password;
private UserService userService; public UserService getUserService() {
return userService;
} public void setUserService(UserService userService) {
this.userService = userService;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String execute() throws Exception {
User user = new User();
user.setUsername(username);
user.setPassword(password);
//获得request
HttpServletRequest request = ServletActionContext.getRequest();
if(userService.loginUser(user)) {
request.setAttribute("url", "user/getBlogInfo.action");
request.setAttribute("info", "登陆成功");
//将username保存到session范围中
// HttpSession session =request.getSession();
Map session = ActionContext.getContext().getSession();
// session.setAttribute("username", username);
session.put("username", username);
return SUCCESS;
} else {
request.setAttribute("url", "login.jsp");
request.setAttribute("info", "登陆失败");
return ERROR;
}
} }
7.
package com.sanqing.action; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.UUID; import org.apache.commons.io.FilenameUtils;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class PhotoUpload extends ActionSupport{
private File myFile;
private String myFileContentType;
private String myFileFileName; public File getMyFile() {
return myFile;
} public void setMyFile(File myFile) {
this.myFile = myFile;
} public String getMyFileContentType() {
return myFileContentType;
} public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
} public String getMyFileFileName() {
return myFileFileName;
} public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
} public String execute() throws Exception {
//获得username
Map session = ServletActionContext.getContext().getSession();
String username = (String) session.get("username"); //创建一个输入流
InputStream is = new FileInputStream(myFile);
//设置文件保存目录
String photoPath =
ServletActionContext.getServletContext().getRealPath("/user/photo/" + username);
File filePhotoPath = new File(photoPath);
if(!filePhotoPath.isDirectory()) {
filePhotoPath.mkdir();
} //解决中文文件名问题
String extension = FilenameUtils.getExtension(this.getMyFileFileName());
String filename = UUID.randomUUID().toString() + "."+ extension; //设置目标文件
File tofile = new File(photoPath,filename);
//使用输出流来包装目标文件
OutputStream os = new FileOutputStream(tofile);
byte[] buffer = new byte[1024];
int length = 0;
while((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
//关闭输入流
is.close();
//关闭输出流
os.close(); return this.SUCCESS;
} }
8.Register-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<validator type="requiredstring">
<param name="fieldName">username</param>
<param name="trim">true</param>
<message>必须输入用户名</message>
</validator> <validator type="regex">
<param name="fieldName">username</param>
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>用户名长度必须为6至20之间</message>
</validator> <validator type="requiredstring">
<param name="fieldName">password</param>
<param name="trim">true</param>
<message>必须输入密码</message>
</validator> <validator type="regex">
<param name="fieldName">password</param>
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>密码长度必须为6至20之间</message>
</validator> <validator type="requiredstring">
<param name="fieldName">repassword</param>
<param name="trim">true</param>
<message>必须输入确认密码</message>
</validator> <validator type="regex">
<param name="fieldName">repassword</param>
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>确认密码长度必须为6至20之间</message>
</validator> <validator type="fieldexpression">
<param name="fieldName">repassword</param>
<param name="expression"><![CDATA[(repassword==password)]]></param>
<message>密码和确认密码必须一致</message>
</validator> <validator type="requiredstring">
<param name="fieldName">nickname</param>
<param name="trim">true</param>
<message>必须输入昵称</message>
</validator> <validator type="regex">
<param name="fieldName">nickname</param>
<param name="expression"><![CDATA[([\u4e00-\u9fa5]{2,20})]]></param>
<message>昵称长度必须为2至20之间</message>
</validator> <validator type="requiredstring">
<param name="fieldName">answer</param>
<param name="trim">true</param>
<message>必须输入密码保护答案</message>
</validator> <validator type="regex">
<param name="fieldName">answer</param>
<param name="expression"><![CDATA[([\u4e00-\u9fa5]{5,50})]]></param>
<message>密码保护答案长度必须为5至50之间</message>
</validator>
</validators>
9.
package com.sanqing.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.User;
import com.sanqing.service.UserService; public class Register extends ActionSupport{
private String username;
private String password;
private String repassword;
private String nickname;
private String question;
private String answer;
private UserService userService; public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
} public String execute() throws Exception {
//封装一个user对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setNickname(nickname);
user.setQuestion(question);
user.setAnswer(answer);
//获得request
HttpServletRequest request = ServletActionContext.getRequest();
if(userService.registerUser(user)) {
request.setAttribute("url", "login.jsp");
request.setAttribute("info", "注册成功");
return SUCCESS;
}else {
request.setAttribute("url", "register.jsp");
request.setAttribute("info", "注册失败");
return ERROR;
}
} }
10.
package com.sanqing.action; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.fenye.Page;
import com.sanqing.fenye.Result;
import com.sanqing.po.Article;
import com.sanqing.service.ArticleService; public class ShowAllArticle extends ActionSupport{
private ArticleService articleService;
private int currentPage; public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public ArticleService getArticleService() {
return articleService;
}
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
} public String execute() throws Exception {
//通过调用业务逻辑组件来完成查询
Page page = new Page();
page.setCurrentPage(this.getCurrentPage());
page.setEveryPage(10); Result result = articleService.showArticleByPage(page);
page = result.getPage();
List<Article> all = result.getList(); List critiqueCounts = new ArrayList();
for(Article article : all) {
critiqueCounts.add(articleService.getCritiqueCount(article.getId()));
} //把查询到的结果保存在一个范围,request
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("all", all);
request.setAttribute("page", page);
request.setAttribute("critiqueCounts",critiqueCounts);
return this.SUCCESS;
} }
11.
package com.sanqing.action; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.fenye.Page;
import com.sanqing.fenye.Result;
import com.sanqing.po.Article;
import com.sanqing.po.BlogInfo;
import com.sanqing.service.ArticleService;
import com.sanqing.service.BlogInfoService;
import com.sanqing.service.CritiqueService;
import com.sanqing.service.DianjiliangService; public class ShowArticle extends ActionSupport {
// 业务逻辑组件属性
private ArticleService articleService;
// id属性
private int id;
// 点击量的业务逻辑组件
private DianjiliangService dianjiliangService;
// 评论的业务逻辑组件
private CritiqueService critiqueService;
//设置当前页
private int currentPage; //username
private String username; private BlogInfoService blogInfoService; public BlogInfoService getBlogInfoService() {
return blogInfoService;
} public void setBlogInfoService(BlogInfoService blogInfoService) {
this.blogInfoService = blogInfoService;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public int getCurrentPage() {
return currentPage;
} public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
} public CritiqueService getCritiqueService() {
return critiqueService;
} public void setCritiqueService(CritiqueService critiqueService) {
this.critiqueService = critiqueService;
} public DianjiliangService getDianjiliangService() {
return dianjiliangService;
} public void setDianjiliangService(DianjiliangService dianjiliangService) {
this.dianjiliangService = dianjiliangService;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public ArticleService getArticleService() {
return articleService;
} public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
} public String execute() throws Exception {
// 将文章设置到request范围
HttpServletRequest request = ServletActionContext.getRequest();
// 按ID查询文章
Article article = articleService.showArticle(id);
// 获得用户IP
String IP = request.getRemoteAddr();
// 获得当前时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String stime = sdf.format(new Date());
Date time = sdf.parse(stime); if (!dianjiliangService.isVistor(id, IP, time)) {
// 点击量增加
article.setHasread(article.getHasread() + 1);
}
// 将更新的Article保存到数据表中
articleService.addArticle(article); //显示评论
Page page = new Page();
page.setCurrentPage(this.getCurrentPage());
page.setEveryPage(5); Result result = critiqueService.showCritiqueByPage(id, page); request.setAttribute("page", result.getPage());
request.setAttribute("allCri", result.getList());
request.setAttribute("article", article); //取得个性化设置
//通过业务逻辑组件来查询
if(username != null || !"".equals(username)) {
Map session = ActionContext.getContext().getSession();
BlogInfo bloginfo = blogInfoService.getBlogInfo(username);
if(bloginfo != null) {
session.put("blogtitle", bloginfo.getBlogtitle());
session.put("idiograph", bloginfo.getIdiograph());
}
}
return this.SUCCESS;
} }
12.
package com.sanqing.action; import java.io.File;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class ShowPhoto extends ActionSupport{ public String execute() throws Exception {
//获得username
Map session = ServletActionContext.getContext().getSession();
String username = (String) session.get("username"); //设置文件目录
String photoPath =
ServletActionContext.getServletContext().getRealPath("/user/photo/" + username);
//使用File封装
File fphotoPath = new File(photoPath);
//获得相册目录的所有图片文件
String[] photoList = fphotoPath.list();
//将图片列表设置到request范围
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("photoList", photoList);
return super.execute();
} }
13
package com.sanqing.action; import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.fenye.Page;
import com.sanqing.fenye.Result;
import com.sanqing.po.Article;
import com.sanqing.rss.CreateRss;
import com.sanqing.service.ArticleService; public class ShowRSS extends ActionSupport {
private ArticleService articleService;
public ArticleService getArticleService() {
return articleService;
}
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}
public String execute() throws Exception {
Page page = new Page(); //分页信息
page.setCurrentPage(0); //设置当前页为第一页
page.setEveryPage(10); //每页显示10条记录
Result result = articleService.
showArticleByPage(page);//通过调用业务逻辑组件来完成查询
page = result.getPage();
List<Article> all = result.getList();//获得文章结果集
String filePath = ServletActionContext.
getServletContext().getRealPath("/rss.xml");//设置订阅文件地址
CreateRss.publishRss(all, filePath);//写入订阅文件
return this.SUCCESS;
}
}
14.
package com.sanqing.action; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.fenye.Page;
import com.sanqing.fenye.Result;
import com.sanqing.po.Article;
import com.sanqing.service.ArticleService; public class ShowUserAllArticle extends ActionSupport{
private ArticleService articleService;
private int currentPage;
private String username; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public ArticleService getArticleService() {
return articleService;
}
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
} public String execute() throws Exception {
if(username == null || "".equals(username)) {
//首先要获得session
Map session = ActionContext.getContext().getSession();
//获得username
username = (String) session.get("username");
} //通过调用业务逻辑组件来完成查询
Page page = new Page();
page.setCurrentPage(this.getCurrentPage());
page.setEveryPage(5); Result result = articleService.showUserArticleByPage(username, page);
page = result.getPage();
List<Article> all = result.getList();
List critiqueCounts = new ArrayList(); for(Article article : all) {
critiqueCounts.add(articleService.getCritiqueCount(article.getId()));
} //把查询到的结果保存在一个范围,request
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("all", all);
request.setAttribute("page", page);
request.setAttribute("critiqueCounts",critiqueCounts);
return this.SUCCESS;
} }
JavaWeb项目开发案例精粹-第4章博客网站系统-005action层的更多相关文章
- JavaWeb项目开发案例精粹-第4章博客网站系统-006View层
1.showAllArticle.jsp <%@ page language="java" contentType="text/html; charset=gb23 ...
- JavaWeb项目开发案例精粹-第4章博客网站系统-004Service层
1. package com.sanqing.service; import java.util.List; import com.sanqing.fenye.Page; import com.san ...
- JavaWeb项目开发案例精粹-第4章博客网站系统-003Dao层
1. package com.sanqing.dao; import java.util.List; import com.sanqing.fenye.Page; import com.sanqing ...
- JavaWeb项目开发案例精粹-第4章博客网站系统-002辅助类及配置文件
1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...
- JavaWeb项目开发案例精粹-第4章博客网站系统-001设计
1. 2. 3. # MySQL-Front 5.0 (Build 1.0) /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */; /*!40101 SET SQL_MO ...
- JavaWeb项目开发案例精粹-第6章报价管理系统-05Action层
0. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC &quo ...
- JavaWeb项目开发案例精粹-第6章报价管理系统-002辅助类及配置文件
1. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www ...
- JavaWeb项目开发案例精粹-第3章在线考试系统-007View层
0.login.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...
- JavaWeb项目开发案例精粹-第2章投票系统-001设计
1.项目结构 2.数据库设计 # MySQL-Front 5.0 (Build 1.0) /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */; /*!40101 SET ...
随机推荐
- VS2013中常用的一些快捷键
1.编辑时需要前后文切换: 需要自己设置为:ctrl+alt +方向键,向前查看,设置为右方向键,向后查看,设置为左方向键 依次选择:工具->选项->环境->键盘-> 2.查看 ...
- php编写验证码
今天学习到了php登录时的验证码,验证码在我们平时的网站建设中是非常重要的,对于放置一些灌水机.脚本攻击是一个很好地策略. 下面是我写的代码: <?php session_start(); // ...
- android 开发 socket发送会有部分乱码,串码,伴随着数据接收不完整
场景: 客户端A.B,A向B发送json字符串后紧接着发送文件,B接收到文件后才返回消息. 环境:android.使用的是原始的write 和read (若使用的是writeUTF不会出现此问题.)需 ...
- 【Path Sum】cpp
题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...
- mongodb 操作类
在使用这个类之前,建议先自己去写,把方法都了解了再用,这样你就可以在适当的时候修个此类,另外请自己构建PagerInfo using System; using System.Collections. ...
- 如何ping通两台计算机
如何ping通两台计算机 因为ping是基于IP协议的,所以,先要保证两台计算机在同一个子网中,这里涉及到vlan和子网的概念 若两台主机不在同一个子网中则无法ping通 若两台主机在同一个子网中却p ...
- JavaScript原型与原型链学习笔记
一.什么是原型?原型是一个对象,其他对象可以通过它实现属性继承.简单的说就是任何一个对象都可以成为原型 prototype属性: 我们创建的每个函数都有一个prototype属性,这个属性是一个指针, ...
- 【BZOJ】【1008】【HNOI】越狱
快速幂 大水题= = 正着找越狱情况不好找,那就反过来找不越狱的情况呗…… 总方案是$m^n$种,不越狱的有$m*(m-1)^{n-1}$种= = 负数搞搞就好了…… 莫名奇妙地T了好几发…… /** ...
- JavaScript之数据类型讲解
JavaScript中有5种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String.还有1种复杂数据类型——Object,Object本质上是由一 ...
- 单件模式(Singleton Pattern)(转)
概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考 ...