MVC开发案例

   自己根据看的视频按照MVC模式写了一个登录注册案例,界面比较简单,但是一些技巧性的东西还是有不少。


 程序源代码已经上传到我的资源库里了,有需要可以下载  http://download.csdn.net/my

MVC开发模式图



效果展示:

1.首页


2.注册页面


3.注册测试


4.注册成功


5.登录界面


6.登录成功


7.注销成功页面



一、开发步骤
1.搭建开发环境
 1.1 导开发包
  dom4j开发包
  jstl开发包
  beanUtils开发包
  log4j开发包
 
 1.2 创建组织程序包
  cn.liang.domain
  cn.liang.dao
  cn.liang.daoimp
  cn.liang.exception
  cn.liang.filter
  cn.liang.formbean
  cn.liang.service
  cn.liang.service.impl
  cn.liang.web.control (处理请求的servlet)
  cn.liang.web.UI      (给用户提供用户界面的servlet)
  cn.liang.utils 
  junit.test   
 
  WEB-INF/jsp    保存网站所有jsp
 
 1.3 创建代表数据库的Xml文件


二、包结构:

                                                                                                                              



三、config.properties和users.xml文件中的内容格式



四、代码

1. cn.linag.daomain  模型包中类代码

1.1 User类代码

package cn.liang.domain;

import java.util.Date;

public class User {
private String id;
private String username;
private String password;
private String nickname;
private String email;
private Date birthday;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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 getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}

@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", nickname=" + nickname + ", email=" + email
+ ", birthday=" + birthday + "]";
}
}

1.2 TokenProcessor 类代码

package cn.liang.domain;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import sun.misc.BASE64Encoder;

// 令牌发生器  单例模式
public class TokenProcessor {

private static final TokenProcessor token = new TokenProcessor();
private TokenProcessor() {}

public static TokenProcessor instance()
{
return token;
}
// 产生唯一标示符
public String generateToken()
{
String str = System.currentTimeMillis()+ new Random().nextInt()+"";
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(str.getBytes());
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(md5);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}


2.cn.liang.dao包中类的代码

2.1  UserDao接口代码

package cn.liang.dao;

import cn.liang.domain.User;

public interface UserDao {

// 添加用户
public abstract void add(User user);


// 根据用户名和密码查找用户
public abstract User find(String username, String password);

//根据用户名查找
public abstract boolean find(String username);
}


3.cn.liang.dao.imlp    接口实现包中类代码

3.1 UserDaoImpl实现类代码

package cn.liang.dao.impl;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;

import cn.liang.dao.UserDao;
import cn.liang.domain.User;
import cn.liang.utils.XmlUtils;


public class UserDaoImpl implements UserDao {

public void add(User user) {

try {
Document document = XmlUtils.getDocument();    // 调用工具类获取Xml文档
Element root = document.getRootElement();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
   Element e = root.addElement( "user" )
           .addAttribute( "id", user.getId() )
           .addAttribute( "username",user.getUsername() )
           .addAttribute( "password", user.getPassword())
           .addAttribute( "birthday", user.getBirthday()==null ?"":df.format(user.getBirthday()) )
           .addAttribute( "nickname", user.getNickname())
           .addAttribute("email", user.getEmail());
   
   XmlUtils.write2Xml(document); // 写入Xml文档
   
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/* (non-Javadoc)
* @see cn.liang.dao.impl.UserDao#find(java.lang.String, java.lang.String)
*/
public User find(String username,String password){

try {
Document document = XmlUtils.getDocument();
Element e = (Element) document.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");

if( null == e )
return null;

User user = new User();
String birthday = e.attributeValue("birthday"); 

if( null == birthday || birthday.trim().length()<=0 )
{
user.setBirthday(null);
}
else
{
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(df.parse(birthday));
}

user.setId(e.attributeValue("id"));
user.setNickname(e.attributeValue("nickname"));
user.setPassword(e.attributeValue("password"));
user.setUsername(e.attributeValue("username"));
user.setEmail(e.attributeValue("email"));
return user;
} catch (Exception e) {


throw new RuntimeException(e);
}
}

//查找
/* (non-Javadoc)
* @see cn.liang.dao.impl.UserDao#find(java.lang.String)
*/
public boolean find(String username){
try {
Document document = XmlUtils.getDocument();
Element e = (Element) document.selectSingleNode("//user[@username='"+username+"']");

if( null == e )
return false;
else
   return true;
} catch (Exception e) {

throw new RuntimeException(e);
}
}
}

4.cn.liang.service.impl  实现包中类的代码

4.1BusinessServiceImpl 类代码

package cn.liang.service.impl;

import cn.liang.dao.UserDao;
import cn.liang.domain.User;
import cn.liang.exception.UserExistException;
import cn.liang.utils.DaoFactory;
import cn.liang.utils.ServiceUtils;


public class BusinessServiceImpl {

private static UserDao userDao = DaoFactory.getIntance().getUserDao();// 工厂模式获得UserDao的实现类
// 给Web层提供服务
// 注册
public void register(User user) throws UserExistException
{
// 看是否存在
boolean b = userDao.find(user.getUsername());
if( b )
{
throw new UserExistException();// 发现用户存在则抛出一个编译时异常提醒上级处理
}
else{
String password = ServiceUtils.getMd5(user.getPassword());// 以md5值存入数据库中
user.setPassword(password);
userDao.add(user);
}
}
// 登录服务
public User login(String username,String password) 
{
User user = userDao.find(username,ServiceUtils.getMd5(password));
return user;
}
}

5.cn.liang.utils  工具包中类的代码

5.1XmlUtils 类代码

package cn.liang.utils;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


public class XmlUtils {

private static String filepath ;
static{         // 在静态代码块中利用类加载器获取文件路径
filepath = XmlUtils.class.getClassLoader().getResource("users.xml").getPath();
}

public static Document getDocument() throws DocumentException
{
SAXReader reader = new SAXReader();
        Document document = reader.read(new File(filepath));
        return document;
}


public static void write2Xml(Document document) throws IOException
{
        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter writer = new XMLWriter(new FileOutputStream(filepath), format);
        writer.write( document );
        writer.close();
}
}


5.2ServiceUtils 类

package cn.liang.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

public class ServiceUtils {

// 获取信息的md5值
public static String getMd5(String message)
{
try {
if( null == message)
return "";
MessageDigest md = MessageDigest.getInstance("md5");    // MD5算法
byte[] md5 = md.digest(message.getBytes());

BASE64Encoder encoder = new BASE64Encoder();   // 利用Base64编码成字符
return encoder.encode(md5);

} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}

5.3 WebUtils 类

package cn.liang.utils;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import com.sun.org.apache.commons.beanutils.BeanUtils;
import com.sun.org.apache.commons.beanutils.ConvertUtils;
import com.sun.org.apache.commons.beanutils.Converter;


public class WebUtils {


// 把表单中的数据封装的FormBean中
public static <T> T request2Bean(HttpServletRequest request,Class<T> beanClass) 
{

try {
//1. 建立FormBean
T formBean = beanClass.newInstance();

//2.调用BeanUtils把数据封装到formBean中
/*
* 第一种方法,逐个获取
* Enumeration e = request.getParameterNames();
while( e.hasMoreElements() )
{
String name = (String) e.nextElement();
String value = request.getParameter(name);
BeanUtils.setProperty(formBean, name, value);
}*/

/* 第二种方法 整个移植*/
Map map = request.getParameterMap();
BeanUtils.populate(formBean, map);

return formBean;
} catch (Exception e) {
throw new RuntimeException(e);

}

/*将表单类中的信息拷贝到对应的类中 */
public static void copyBean(Object dest,Object src){

// 为了把RegisterForm中String类型的birthday属性转换到User中的Date类型birthday属性
// 需要注册转换器 (String - Date)
ConvertUtils.register(new Converter() {

public Object convert(Class type, Object value) {
// TODO Auto-generated method stub
if(null== value)
return null;
String str = (String) value;
if( null== str || str.trim().equals(""))
return null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(str);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}, Date.class);


try {
// 通过BeanUtils类调用方法将表单类中的信息拷贝到对应的类中 ,拷贝过程中只支持8中基本数据类型
BeanUtils.copyProperties(dest, src);

} catch (Exception e) {
throw new RuntimeException(e);
}
}

// 利用UUID算法获取唯一ID号
public static String generateID()
{
return UUID.randomUUID().toString();
}

/*   判断令牌号是否有效
* 如果表单的令牌号和服务器端的令牌号相同则表单第一次提交,此时在服务器端删掉令牌号,以便表单重复提交时,
* 服务器端找不到对应令牌号,则表明表单是重复提交的,则放弃处理
*/
public static boolean isTokenValid(HttpServletRequest request){

String token = request.getParameter("token");  // 获取表单传过来的令牌号
if(null == token)
return false;

String sToken = (String) request.getSession().getAttribute("token");
if( null == sToken)
return false;

if(! sToken.equals(token) )
return false;

//如果是第一次提交则,去掉token ,防止重复提交
request.getSession().removeAttribute("token");
return true; 
}
}

5.4 DaoFactory 类

package cn.liang.utils;


import java.io.InputStream;
import java.util.Properties;
import cn.liang.dao.UserDao;


/*工厂类 ,通过反射机制 产生所需要的类*/
public class DaoFactory {
private static UserDao userdao= null;
private static DaoFactory instance = new DaoFactory();


private  DaoFactory() {

try {

InputStream is = DaoFactory.class.getClassLoader().getResourceAsStream("config.properties");
Properties prop = new Properties();
prop.load(is);
String className = prop.getProperty("UserDaoClass");

Class clazz = Class.forName(className);
userdao = (UserDao) clazz.newInstance();

} catch (Exception e) {
throw new RuntimeException(e);

}

public static DaoFactory getIntance()
{
return instance;
}

public  UserDao getUserDao(){
return userdao;
}
}

6.cn.liang.exception  异常包中类的代码

6.1UserExistException

(用户已存在异常)

package cn.liang.exception;


public class UserExistException extends Exception {


public UserExistException() {
// TODO Auto-generated constructor stub
}
public UserExistException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public UserExistException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
public UserExistException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
}

7.cn.liang.filter  过滤器包中类的代码

7.1Encoding

(过滤request和response的编码方式)

package cn.liang.filter;

import java.io.IOException;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Encoding implements Filter {


public void destroy() {
// TODO Auto-generated method stub
}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
arg1.setCharacterEncoding("UTF-8");
arg0.setCharacterEncoding("UTF-8");
arg2.doFilter(arg0, arg1);
}

public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}

8.cn.liang.web.contoller  包中类的代码


8.1  CheckCodeServlet  

(生成图片验证码)

package cn.liang.web.controller;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;


import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class CheckCodeServlet extends HttpServlet {


private static final int HEIGHT = 20;
private static final int WIDTH = 120;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();


// drawimage
drawRect(g);
//画边框
drawBorder(g);
//画随机干扰线
drawLine(g);
//写随机生成验证码
String checkCode = drawString((Graphics2D)g);
// 保存到session中
request.getSession().setAttribute("checkCode", checkCode);
//设置发送的内容
response.setContentType("image/jpeg");
//发头控制浏览器不要缓存
response.setHeader("expires", "-1");    
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 输出到response.getOutputStream()中
ImageIO.write(image, "jpg", response.getOutputStream());
// 释放资源
g.dispose();
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}


private String drawString(Graphics2D g) {
// TODO Auto-generated method stub
String checkCode = "";
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD, 16));
// 常见的中文 UTF-8编码
String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";
Random r = new Random();
int y = 15;
int x = 10;
for( int i = 0;i < 4;i++ )
{
int d= r.nextInt()%30;

String str =String.valueOf(base.charAt(r.nextInt(base.length()-1)));
checkCode += str;
g.drawString(str, x, y);
// 弧度 = 角度* Math.PI / 180
g.rotate(d*Math.PI/180,x,y);
g.rotate(-d*Math.PI/180,x,y);
x+= 30;
}
return checkCode;
}

private void drawLine(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.RED);
Random r = new Random();
for( int i = 0;i < 4;i++ )
{
int x1 = r.nextInt(WIDTH);
int y1 = r.nextInt(HEIGHT);

int x2 = r.nextInt(WIDTH);
int y2 = r.nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}

private void drawRect(Graphics g) {
// TODO Auto-generated method stub

g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
}


private void drawBorder(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.BLUE);
g.drawRect(0, 0, WIDTH-1, HEIGHT-1);
}
}


8.2  LoginServlet

  (处理登录请求)

package cn.liang.web.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.liang.domain.User;
import cn.liang.service.impl.BusinessServiceImpl;
import cn.liang.utils.WebUtils;
import cn.liang.web.formbean.UserForm;

public class LoginServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.构造一个用户表单类
UserForm form = WebUtils.request2Bean(request, UserForm.class);
//2. 检查信息的校验
boolean b = form.isValid();
//3.校验失败则返回登录页面,并给出提示
if( !b ){
request.setAttribute("form", form);
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return;
}
//4.调用service方法进行登录
BusinessServiceImpl service = new BusinessServiceImpl();
User user= service.login(form.getUsername(), form.getPassword());
if( null == user )
{
//5.失败则给出提示
form.getErrors().put("username", "用户名或者密码有误");
   request.setAttribute("form", form);
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return;
}
//6.登录成功跳到全局显示页面,显示登录成功
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath()+"/index.jsp");
return;
}
}


8.3  LogoutServlet

(处理注销请求)

package cn.liang.web.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LogoutServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

HttpSession session = request.getSession(false);
if( null != session )
session.removeAttribute("user");
// 注销成功,跳到全局显示页面
request.setAttribute("message", "注销成功,3秒后跳转到首页!!<meta http-equiv='refresh' content='3;url="+request.getContextPath()+"/index.jsp'> <a href='"+request.getContextPath()+"/index.jsp' >点击回首页</a>");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}


8.4  RegisterServlet

(处理注册请求)

package cn.liang.web.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.liang.domain.User;
import cn.liang.exception.UserExistException;
import cn.liang.service.impl.BusinessServiceImpl;
import cn.liang.utils.WebUtils;
import cn.liang.web.formbean.RegisterForm;

public class RegisterServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");


/*防止表单重复提交检查 */
boolean flage = WebUtils.isTokenValid(request);
if( !flage )  // 如果已经提交过则不处理返回表单页面
{
request.setAttribute("warning", "请不要重复提交");
}

//1.检验校验信息的合法性(把表单数据封装到formBean中)
RegisterForm form = WebUtils.request2Bean(request, RegisterForm.class);
// 获取session中保存的验证码
String checkCode = (String) request.getSession().getAttribute("checkCode");

// 验证表单信息
boolean b = form.validate(checkCode);
//2.如果校验失败则返回表单页面
if( !b ){
request.setAttribute("form", form);
request.getRequestDispatcher("/servlet/RegisterUIServlet").forward(request, response);
return ;
}
 
//3.如果校验通过则调用service方法进行注册

BusinessServiceImpl service = new BusinessServiceImpl();
User user = new User();
// 调用WebUtils方法把formbean中数据拷贝到user中
WebUtils.copyBean(user, form);
// 获取ID
user.setId(WebUtils.generateID());

//4.调用service方法注册,如果注册失败,原因是用户已存在  ,则给出提示信息
try {
service.register(user);


//6.调用service方法注册,注册成功则跳到全局显示页面给出成功提示
request.getSession().setAttribute("user", user);
request.setAttribute("message", "恭喜你 "+user.getNickname()+" 注册成功   3秒后跳转到首页!!<meta http-equiv='refresh' content='3;url="+request.getContextPath()+"/index.jsp'> <a href='"+request.getContextPath()+"/index.jsp' >点击回首页</a>");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
} catch (UserExistException e) {
form.getErrors().put("username", "用户名已存在");
request.setAttribute("form", form);
request.getRequestDispatcher("/servlet/RegisterUIServlet").forward(request, response);
return;
}catch(Exception e){
//5.调用service方法注册,如果注册失败,原因是其他方面,则跳到全局显示页面给出友好错误提示
e.printStackTrace();// 记录异常
request.setAttribute("message", "出现未知错误,我们会尽快解决");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
}
}

9. cn.liang.web.UI  显示界面包中类的代码

 9.1  LogUIServlet

(显示登录界面)

package cn.liang.web.UI;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogUIServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

9.2 RegisterUIServlet

(显示登录界面)

package cn.liang.web.UI;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.liang.domain.TokenProcessor;

public class RegisterUIServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 利用令牌发生器产生唯一令牌给显示的表单,用户防止用户重复提交,或者用UUID算法
String token = TokenProcessor.instance().generateToken();
request.getSession().setAttribute("token", token);

request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}


10. cn.liang.web.fombean  表单类包中类的代码

 10.1 RegisterForm

 (注册表单类)

package cn.liang.web.formbean;

import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

public class RegisterForm {
private String username;
private String password;
private String password2;
private String email;
private String birthday;
private String nickname;
private String checkCode;
private Map<String,String> errors = new HashMap<String, String>();
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 getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public String getEmail() {
return email;
}


public void setEmail(String email) {
this.email = email;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}

public String getCheckCode() {
return checkCode;
}
public void setCheckCode(String checkCode) {
this.checkCode = checkCode;
}
public Map<String, String> getErrors() {
return errors;
}
public void setErrors(Map<String, String> errors) {
this.errors = errors;
}
/*
* 用户名不能为空,且为3-8个字母
* 密码不能为空,且为3-8个数字
* 确认密码不能为空,且要一致
* 邮箱不能为空,且格式要正确
* 生日可以为空,如果不为空格式要正确
* 昵称不能为空,且必须为汉字
* */
public boolean validate(String checkCode)
{
boolean isOk = true;
if(null == this.username || this.username.trim().equals(""))
{
isOk = false;
errors.put("username", "用户名不能为空");
}else{
if( !this.username.matches("[A-Za-z]{3,8}") )
{
isOk = false;
errors.put("username", "用户名为3-8个字母");
}
}
if(null == this.password || this.password.equals(""))
{
isOk = false;
errors.put("password", "密码不能为空");
}else{
if( !this.password.matches("\\d{3,8}") )
{
isOk = false;
errors.put("password", "密码为3-8个数字");
}
}
if(null == this.password2 || this.password2.equals(""))
{
isOk = false;
errors.put("password2", "确认密码不能为空");
}else{
if( !this.password2.equals(this.password) )
{
isOk = false;
errors.put("password2", "两次密码不一致");
}
}
if(null == this.email || this.email.trim().equals(""))
{
isOk = false;
errors.put("email", "邮箱不能为空");
}else{
if( !this.email.matches("\\w+@\\w+(\\.\\w+)+") )
{
isOk = false;
errors.put("email", "邮箱格式不正确");
}
}

if(null != this.birthday || !this.birthday.trim().equals(""))
{
try{
DateLocaleConverter dc = new DateLocaleConverter();
dc.convert(this.birthday, "yyyy-MM-dd");
}
catch(Exception e){
isOk = false;
errors.put("birthday", "日期格式不正确");
}
}

if(null == this.nickname || this.nickname.trim().equals(""))
{
isOk = false;
errors.put("nickname", "昵称不能为空");
}else{
if( !this.nickname.matches("[\u4e00-\u9fa5]+") )
{
isOk = false;
errors.put("nickname", "昵称必须为汉字");
}
}
if(null == this.checkCode || this.checkCode.trim().equals("")|| !this.checkCode.equals(checkCode))
{
isOk = false;
errors.put("checkCode", "验证码不正确");
}
return isOk;
}
}

 10.2 UserForm

 (登录表单类)

package cn.liang.web.formbean;

import java.util.HashMap;
import java.util.Map;

public class UserForm {
private String username;
private String password;
private Map<String,String> errors = new HashMap<String, String>();
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 Map<String, String> getErrors() {
return errors;
}
public void setErrors(Map<String, String> errors) {
this.errors = errors;
}
public boolean isValid()
{
boolean isOk = true;
if( null == this.username || this.username.trim().equals("")){
isOk = false;
errors.put("username", "用户名不能为空");
}

if( null == this.password || this.password.equals("")){
isOk = false;
errors.put("password", "密码不能为空");
}
return isOk;
}
}

11.cn.liang.test   测试包代码

  11.ServiceTest

 (测试 service实现类的方法)

package junit.test;


import java.io.UnsupportedEncodingException;
import java.util.Date;


import org.junit.Test;


import cn.liang.dao.UserDao;
import cn.liang.domain.User;
import cn.liang.exception.UserExistException;
import cn.liang.service.impl.BusinessServiceImpl;
import cn.liang.utils.DaoFactory;


public class ServiceTest {

@Test
public void testRegister()
{
User user = new User();
user.setBirthday(new Date());
user.setEmail("aa@sin.com");
user.setId("124334");
user.setNickname("water");
user.setPassword("123");
user.setUsername("周亮");

BusinessServiceImpl service = new BusinessServiceImpl();
try {
service.register(user);

} catch (UserExistException e) {
System.out.println("用户已存在!");
}
}
@Test
public void TestLogin()
{
 BusinessServiceImpl service = new BusinessServiceImpl();
 User user = service.login("zhouldang", "123");
 System.out.println(user);
}

@Test
public void TestgetUserDao()
{
 UserDao dao =DaoFactory.getIntance().getUserDao();
 System.out.println(dao);
}
}

 11.2 UserDaoTest

 (测试UserDao接口中的方法)

package junit.test;

import java.util.Date;
import org.junit.Test;
import cn.liang.dao.UserDao;
import cn.liang.dao.impl.UserDaoImpl;
import cn.liang.domain.User;

public class UserDaoTest {

@Test
public void testAdd()
{
User user = new User();
user.setBirthday(new Date());
user.setId("111");
user.setNickname("liang");
user.setPassword("123");
user.setUsername("zhouliang");
user.setEmail("laisdf@sin.com");
UserDao dao = new UserDaoImpl();
dao.add(user);
}

@Test
public void testFind()
{
UserDao dao = new UserDaoImpl();
User user = dao.find("zhouliang", "123");
System.out.println(user);
}
@Test
public void testFindByName()
{
UserDao dao = new UserDaoImpl();
boolean result = dao.find("dfg");
System.out.println(result);
}
}


五、JSP页面代码

1.index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
<style>
#top{
text-align:right;
}
</style>
  </head>
  
  <body>
 <center>
 <h1>MVC开发模式</h1>
 </center><br/>
 
 <div id="top">
 <c:choose>
 <c:when test="${user!=null}">
             欢迎你 ${user.nickname } <a href=" <c:url value= '/servlet/LogoutServlet'/>" >注销</a>
 </c:when>
 <c:otherwise>
 <a href="<c:url value='/servlet/RegisterUIServlet'/>" >注册</a>
 <a href="<c:url value='/servlet/LogUIServlet'/>">登录</a>
 </c:otherwise>
</c:choose>
 </div>
  </body>
</html>

2.login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
     /*防止表单重复提交*/
   var iscommitted = false;
   function doSubmit()
   {
     if( !iscommitted )
     {
       iscommitted = true;
       return true;
     }
     return false;
   }
  
  </script>
<link rel="stylesheet" type="text/css" href="../css/login.css">
<title>登录</title>
</head>
<body>
<center>
<div id="container">
 <div id="login">
   <div id="form">
 <form action="<c:url value='/servlet/LoginServlet' /> " method="post" οnsubmit="return doSubmit()">
   <div id="input">
<div>用户:<input type="text" name="username" value="${form.username }" />
<span id="message">${form.errors.username }</span>
</div><br/>

<div>密码: <input type="password" name = "password"  value="${form.password }"/>
<span id="message">${form.errors.password }</span>
</div><br/>
</div>
<div id="btn">
<input type="submit" value="登录" />
<input type="button" value="注册" οnclick=" window.location.href='<c:url value="/servlet/RegisterUIServlet" />' " />
</div>
 </form>
</div>
 </div>
</div>
</center>
</body>
</html>

3.register.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

 <head>
<title>注册页面</title>
<script type="text/javascript">
   /*更新验证码*/
  function changeimage(img)
     {
     /*每点击一次地址都不一样,这样浏览器就不会取缓存中的页面而是重新访问  */
        img.src = img.src+"?"+ new Date().getTime();
     }
     
     /*防止表单重复提交*/
   var iscommitted = false;
   function doSubmit()
   {
     if( !iscommitted )
     {
       iscommitted = true;
       return true;
     }
     return false;
   }
  </script>
 <script src="../js/ShowCalendar.js" type="text/javascript"></script>
<link  href="../css/register.css" rel="stylesheet" type="text/css"/>
</head>

<body >
<div id="container">
<div id="header"></div>

<div id="main">
 <div id="notice">
   <h1>注意须知</h1>
1.在本网站注册会员,必须遵守相关规定,不得污蔑、诽谤他人。<br/><br/>
2.网站会员要服从本网站的管理,一些管理方法的最终解释权归本网站所有。
 </div>
 <span  id="warn">${warning }</span>
 
 <form action="<c:url value='/servlet/RegisterServlet' />" method="post" οnsubmit="return doSubmit()" >
 <input type="hidden" value="${token }" name="token"> <!--表单唯一标示符-->
 <table  id="formtable">
 <tr>
<td class="td1">登录账号:</td>
<td  class="td2">
<input class="userinput" type="text" name="username" value="${form.username }"/>
<span class="message" >${form.errors.username }</span>
</td>
 </tr>
<tr>
<td height="30" class="td1">重复密码:</td>
<td  class="td2">
<input class="userinput" type="password" name="password" value="${form.password }"/>
<span class="message" >${form.errors.password }</span>
</td>
   </tr>
 <tr>
<td class="td1">确认密码:</td>
<td  class="td2">
<input class="userinput" type="password" name="password2" value="${form.password2 }"/>
<span class="message" >${form.errors.password2 }</span>
</td>
 </tr>
 <tr>
<td class="td1">电子邮箱:</td>
<td  class="td2">
<input class="userinput" type="text" name="email" value="${form.email }"/>
<span class="message" >${form.errors.email }</span>
</td>
 </tr>
 <tr>
<td class="td1">生日:</td>
<td  class="td2">
<input class="userinput" name="birthday" type="text" id="birthday"  title="点击选择" onClick="javascript:ShowCalendar(this.id)" size="20" value="${form.birthday }">
<span class="message" >${form.errors.birthday }</span>
</td>
 </tr>
 <tr>
<td class="td1">你的昵称:</td>
<td  class="td2">
  
  <input  class="userinput"  type="text" name="nickname" value="${form.nickname }"/> 
<span class="message" >${form.errors.nickname }</span>
</td>
 </tr>
  <tr>
<td class="td1">图片认证:</td>
<td  class="td2">
<input class="userinput" type="text" name="checkCode" value="${form.checkCode }"/>
<img alt="" src="<c:url value='/servlet/CheckCodeServlet'/>"  οnclick="changeimage(this)"  style="cursor:hand">
  <span id="checkcode" >${form.errors.checkCode }</span> 
</td>
 </tr>
 </table>
 
 <div id="formsubmit">
  <input type="reset" name="reset" value="重置" style="cursor:hand"/>
  <input type="submit" name = "submit" value="注册" style="cursor:hand"/>
 </div>
 </form>
</div>
</div>
</body>
</html>

4.message.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>全局消息显示页面</title>
  </head>
  <body>
  ${message }
  </body>
</html>

5.ExceptionError.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>全局未知错误页面</title>
  </head>
  <body>
  出现未知错误!我们会尽快维护<br/>
  <%out.println(exception.getMessage()); %>
  </body>
</html>


六、对于一些不可预知的异常在web.xml中配置处理错误显示页面

关键代码如下:


七、image文件下的图片

img2.jpg


login.jsp


8、css目录下的css样式文件内容

8.1login.css


 body{
  margin:0px;
  padding:0px;
  font-size:12px;
  background-color:#004790;
  overflow:hidden;
  text-align:center;
  }
  #container{
  width:980px;
  }
  #login{
  background-image:url(../image/login.jpg);
  width:935px;
  height:296px;
  margin-top:120px;
  position:relative;
  }
  #form{
  position:absolute;
  top:135px;
  left:37%;
  }
  #input
  {
  margin:0px 0px 2px 0px;
  padding:0px;
  width:300px;
  }
  #input div{
  margin:0px;
  padding:0px;
  }
  #input input
  {
  margin:0px;
   width:110px;
   background-color:#000033;
   color:#FFFFFF;
   height:20px;
   }
   #btn{
   margin:0px;
   padding:0px 0px 0px 35px;
   width:300px;
   text-align:left;
   }
   #btn input{
   background-color:#003333;
   color:#FFFFFF;
   margin-left:18px;
   padding:2px 0px 0px 0px;
   cursor:default;
   }
   #message{
   color:#ffffff;
   margin:0px;
   padding:0px;
   width:120px;
   }

8.2register.css

body{
margin:0px;
padding:0px;
font-size:12px;
background-color:#0066FF;
color:#FFFFFF;
}
#container{
margin:0px;
padding:0px;
width:100%;
height:100%;
}
#header{
background-image:url(../image/img2.jpg);
width:1351px;
height:70px;
}
#main
{
margin:0px;
padding:20px 0px 0px 60px;
height:100%;
}
#notice{
margin:0px 0px 30px 0px;
padding:0px;
text-align:left;
font-size:14px;
}
#formtable{
font-size:14px;
font-family:"宋体";
}
#formtable tr{
margin:10px 0px 20px 0px;
}
#formtable td{
height:20px;
}
#formtable input{
width:220px;
color:#000000;
font-family:"新宋体";
}
.td1{
width:120px;
text-align:left;
}
.td2{
position:relative;
}
 #formtable td img{
    position:absolute;
    top:2px;

#formsubmit{
margin:10px 0px 0px;
padding:0px 0px 0px 126px;
}
#formsubmit input{
margin-left:20px;
padding-top:3px;
background:#CCCCFF;
font-style:inherit;
color:#000000;
font-family:"Adobe 黑体 Std R";
width:70px;
height:25px;
}
#warn{
color:#ff0000;
text-align:center;
font-size:16px;
padding:0px 0px 0px 150px;
}
#checkCode{
margin:0px 0px 0px 130px;
}


九、目录下的ShowCalendar.js

// 日期选择
// By Ziyue(http://www.web-v.com/)
var months = new Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"); 
var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 
var days = new Array("日","一", "二", "三", "四", "五", "六"); 
var today; 


document.writeln("<div id='Calendar' style='position:absolute; z-index:1; visibility: hidden; filter:\"progid:DXImageTransform.Microsoft.Shadow(direction=135,color=#999999,strength=3)\"'></div>");


function getDays(month, year)

//下面的这段代码是判断当前是否是闰年的 
if (1 == month) 
return ((0 == year % 4) && (0 != (year % 100))) || (0 == year % 400) ? 29 : 28; 
else 
return daysInMonth[month]; 



function getToday() 

//得到今天的年,月,日 
this.now = new Date(); 
this.year = this.now.getFullYear(); 
this.month = this.now.getMonth(); 
this.day = this.now.getDate(); 
}


function getStringDay(str) 

//得到输入框的年,月,日
var str=str.split("-")


this.now = new Date(parseFloat(str[0]),parseFloat(str[1])-1,parseFloat(str[2])); 
this.year = this.now.getFullYear(); 
this.month = this.now.getMonth(); 
this.day = this.now.getDate(); 
}


function newCalendar() { 
var parseYear = parseInt(document.all.Year.options[document.all.Year.selectedIndex].value); 
var newCal = new Date(parseYear, document.all.Month.selectedIndex, 1); 
var day = -1; 
var startDay = newCal.getDay(); 
var daily = 0; 


if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) 
day = today.day; 


var tableCal = document.all.calendar; 
var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear());


for (var intWeek = 1; intWeek < tableCal.rows.length;intWeek++) 
for (var intDay = 0;intDay < tableCal.rows[intWeek].cells.length;intDay++) 

var cell = tableCal.rows[intWeek].cells[intDay]; 
if ((intDay == startDay) && (0 == daily)) 
daily = 1; 


if(day==daily) //今天,调用今天的Class 
{
cell.style.background='#6699CC';
cell.style.color='#FFFFFF';
//cell.style.fontWeight='bold';
}
else if(intDay==6) //周六 
cell.style.color='green'; 
else if (intDay==0) //周日 
cell.style.color='red';


if ((daily > 0) && (daily <= intDaysInMonth)) 

cell.innerText = daily; 
daily++; 

else 
cell.innerText = ""; 




function GetDate(InputBox)

var sDate; 
//这段代码处理鼠标点击的情况 
if (event.srcElement.tagName == "TD") 
if (event.srcElement.innerText != "") 

sDate = document.all.Year.value + "-" + document.all.Month.value + "-" + event.srcElement.innerText;
eval("document.all."+InputBox).value=sDate;
HiddenCalendar();




function HiddenCalendar()
{
//关闭选择窗口
document.all.Calendar.style.visibility='hidden';
}


function ShowCalendar(InputBox)
{
var x,y,intLoop,intWeeks,intDays;
var DivContent;
var year,month,day;
var o=eval("document.all."+InputBox);
var thisyear; //真正的今年年份


thisyear=new getToday();
thisyear=thisyear.year;


today = o.value;
if(isDate(today))
today = new getStringDay(today);
else
today = new getToday(); 


//显示的位置
x=o.offsetLeft;
y=o.offsetTop;
while(o=o.offsetParent)
{
x+=o.offsetLeft;
y+=o.offsetTop;
}
document.all.Calendar.style.left=x+2;
document.all.Calendar.style.top=y+20;
document.all.Calendar.style.visibility="visible";


//下面开始输出日历表格(border-color:#9DBAF7)
DivContent="<table border='0' cellspacing='0' style='border:1px solid #0066FF; background-color:#EDF2FC'>";
DivContent+="<tr>";
DivContent+="<td style='border-bottom:1px solid #0066FF; background-color:#C7D8FA'>";


//年
DivContent+="<select name='Year' id='Year' onChange='newCalendar()' style='font-family:Verdana; font-size:12px'>";
for (intLoop = thisyear - 35; intLoop < (thisyear + 2); intLoop++) 
DivContent+="<option value= " + intLoop + " " + (today.year == intLoop ? "Selected" : "") + ">" + intLoop + "</option>"; 
DivContent+="</select>";


//月
DivContent+="<select name='Month' id='Month' onChange='newCalendar()' style='font-family:Verdana; font-size:12px'>";
for (intLoop = 0; intLoop < months.length; intLoop++) 
DivContent+="<option value= " + (intLoop + 1) + " " + (today.month == intLoop ? "Selected" : "") + ">" + months[intLoop] + "</option>"; 
DivContent+="</select>";


DivContent+="</td>";


DivContent+="<td style='border-bottom:1px solid #0066FF; background-color:#C7D8FA; font-weight:bold; font-family:Wingdings 2,Wingdings,Webdings; font-size:16px; padding-top:2px; color:#4477FF; cursor:hand' align='center' title='关闭' onClick='javascript:HiddenCalendar()'>S</td>";
DivContent+="</tr>";


DivContent+="<tr><td align='center' colspan='2'>";
DivContent+="<table id='calendar' border='0' width='100%'>";


//星期
DivContent+="<tr>";
for (intLoop = 0; intLoop < days.length; intLoop++) 
DivContent+="<td align='center' style='font-size:12px'>" + days[intLoop] + "</td>"; 
DivContent+="</tr>";

//天
for (intWeeks = 0; intWeeks < 6; intWeeks++)

DivContent+="<tr>"; 
for (intDays = 0; intDays < days.length; intDays++) 
DivContent+="<td onClick='GetDate(\"" + InputBox + "\")' style='cursor:hand; border-right:1px solid #BBBBBB; border-bottom:1px solid #BBBBBB; color:#215DC6; font-family:Verdana; font-size:12px' align='center'></td>"; 
DivContent+="</tr>"; 

DivContent+="</table></td></tr></table>";


document.all.Calendar.innerHTML=DivContent;
newCalendar();
}

function isDate(dateStr)

var datePat = /^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/;
var matchArray = dateStr.match(datePat);
if (matchArray == null) return false; 
var month = matchArray[3];
var day = matchArray[5]; 
var year = matchArray[1]; 
if (month < 1 || month > 12) return false; 
if (day < 1 || day > 31) return false; 
if ((month==4 || month==6 || month==9 || month==11) && day==31) return false; 
if (month == 2)
{
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); 
if (day > 29 || (day==29 && !isleap)) return false; 

return true;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值