使用Spring+SpringMVC+Mybatis构建学生信息管理系统
在MyEclipse中新建Web Project,在src目录下新建po、mapper包(相当于之前的dao包)、biz、action、util包(工具包用于将Java对象转换成Json字符串输出)
1、引入spring组件包和mybatis组件包以及mybatis-spring的插件包。还需要引入fastjson组件包进行Java对象转json字符串的处理
MyEclipse—>Project Capabilities—>Add Spring Capabilities—>勾选前三个(Spring 3.1 Core Libraries、Persistence Libraries、Web Libraries—>Next—>Enable AOP Builder—>Finish)
从mybaties组件包里复制mybatis-3.3.0.jar、mybatis-spring-1.2.1.jar、mysql-connector-java-5.1.9-bin.jar到项目WEB-INF目录下lib文件夹里
复制fastjson-1.1.33.jar到lib文件夹里
2、编写实体类、Mapper接口类和Mapper的sql映射文件
(对数据库studb保留clazz、student两个表数据)
实体类Clazz.java
package com.po;
import java.io.Serializable;
public class Clazz implements Serializable {
private Integer cid;
private String cname;
public Clazz() {
super();
// TODO Auto-generated constructor stub
}
public Clazz(Integer cid, String cname) {
super();
this.cid = cid;
this.cname = cname;
}
/****** getter&setter ******/
}
实体类Student.java
package com.po;
import ...
public class Student implements Serializable {
private Integer sid;
private String sname;
private String sex;
private String address;
private Date birthday;
private Integer classid;
private String cname;
private String sdate;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(Integer sid, String sname, String sex, String address,
Date birthday, Integer classid, String cname) {
super();
this.sid = sid;
this.sname = sname;
this.sex = sex;
this.address = address;
this.birthday = birthday;
this.classid = classid;
this.cname = cname;
}
public Student(String sname, String sex, String address, Date birthday,
Integer classid) {
super();
this.sname = sname;
this.sex = sex;
this.address = address;
this.birthday = birthday;
this.classid = classid;
}
/****** getter&setter ******/
public String getSdate() {
if(birthday!=null){
//SimpleDateFormat用来格式化时间
sdate=new SimpleDateFormat("yyyy-MM-dd").format(birthday);
}
return sdate;
}
public void setSdate(String sdate) {
if(sdate!=null&&!sdate.trim().equals("")){
try {
birthday=new SimpleDateFormat("yyyy-MM-dd").parse(sdate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.sdate = sdate;
}
}
Mapper接口类StudentMapper添加注解@Service
package com.mapper;
import ...
@Service
public interface StudentMapper {
public int save(Student st);
public int update(Student st);
public int delById(Integer sid);
public Student findById(Integer sid);
public List<Student> findPageAll(Map<String,Object> map); //相当于在Map集合中包装了当前页数page、每页记录数rows
public int findMaxRow();
public List<Clazz> doinit(); //返回班级列表
}
Mapper的sql映射文件StudentMapper.xml
New->XML(Basic Templates)...在mybaties组件包里复制mapper映射文件规范.txt到StudentMapper.xml并做对应修改
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- com.mapper.StudentMapper为接口类 -->
<mapper namespace="com.mapper.StudentMapper">
<insert id="save" parameterType="com.po.Student">
insert into student(sname,sex,address,birthday,classid)
values(#{sname},#{sex},#{address},#{birthday},#{classid})
</insert>
<update id="update" parameterType="com.po.Student">
update student set sname= #{sname},sex=#{sex},address=#{address},
birthday=#{birthday},classid=#{classid} where sid=#{sid}
</update>
<delete id="delById" parameterType="java.lang.Integer">
delete from student where sid=#{sid}
</delete>
<!---parameterType:传递的参数类型; resultType:返回的元素类型 ---!>
<select id="findById" parameterType="java.lang.Integer" resultType="com.po.Student">
select * from student where sid=#{sid}
</select>
<select id="findPageAll" parameterType="java.util.Map" resultType="com.po.Student">
select * from student s,clazz c where s.classid=c.cid order by sid limit ${(page-1)*rows},${rows}
</select>
<select id="findMaxRow" resultType="int">
select count(*) from student
</select>
<select id="doinit" resultType="com.po.Clazz">
select * from clazz where 1=1 order by cid
</select>
<!--- where 1=1的应用仅仅只是为了满足多条件查询页面中不确定的各种因素
而采用的一种构造一条正确能运行的动态SQL语句的一种方法 ---!>
</mapper>
3、编写业务接口和业务实现类,并加入注解@Service
业务接口 IStudentBiz.java,业务接口的实现方法和Mapper接口一样
package com.biz;
import ...
public interface IStudentBiz {
public int save(Student st);
public int update(Student st);
public int delById(Integer sid);
public Student findById(Integer sid);
public List<Student> findPageAll(int page,int rows);
public int findMaxRow();
public List<Clazz> doinit();
}
业务实现类 StudentBiz.java加入@Service和事务注解@Transactional
package com.biz;
import ...
@Service
@Transactional
public class StudentBiz implements IStudentBiz {
@Autowired //自动装配模式
private StudentMapper studentMapper;
public StudentMapper getStudentMapper() {
return studentMapper;
}
public void setStudentMapper(StudentMapper studentMapper) {
this.studentMapper = studentMapper;
}
public int save(Student st) {
return studentMapper.save(st);;
}
public int update(Student st) {
return studentMapper.update(st);
}
public int delById(Integer sid) {
return studentMapper.delById(sid);
}
public Student findById(Integer sid) {
Student st=studentMapper.findById(sid);
return st;
}
public List<Student> findPageAll(int page,int rows) {
if(page<1)page=1;
if(rows<1)rows=5;
Map<String,Object> map=new HashMap<String, Object>();
map.put("page", page);
map.put("rows", rows);
return studentMapper.findPageAll(map);
}
public int findMaxRow() {
return studentMapper.findMaxRow();
}
public List<Clazz> doinit() {
return studentMapper.doinit();
}
}
4、编写控制器接口和实现类,设置注解@Contraller
控制器接口 IStudentAction
package com.action;
import ...
public interface IStudentAction {
public String save(HttpServletRequest request,HttpServletResponse response,Student st);
public String update(HttpServletRequest request,HttpServletResponse response,Student st);
public String delById(HttpServletRequest request,HttpServletResponse response,Integer sid);
public String findById(HttpServletRequest request,HttpServletResponse response,Integer sid);
public String findPageAll(HttpServletRequest request,HttpServletResponse response,Integer page,Integer rows);
public String doinit(HttpServletRequest request,HttpServletResponse response);
}
编写工具类AjaxUtil.java
package com.util;
import ...
public class AjaxUtil {
/***
* 向客户端浏览器发送响应的结果数据
* */
public static void printToString(HttpServletResponse response,String resultString){
response.setCharacterEncoding("utf-8");
PrintWriter out=null;
try {
out=response.getWriter();
out.print(resultString);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接口实现类StudentAction.java
package com.action;
import ...
@Controller
public class StudentAction implements IStudentAction {
@Autowired
private IStudentBiz studentBiz; //依赖的都是接口,不是实现类,否则会报代理异常
public IStudentBiz getStudentBiz() {
return studentBiz;
}
public void setStudentBiz(IStudentBiz studentBiz) {
this.studentBiz = studentBiz;
}
@RequestMapping(value="save_Student.do")
public String save(HttpServletRequest request,
HttpServletResponse response, Student st) {
int code=studentBiz.save(st);
if(code>0){
AjaxUtil.printToString(response, ""+1);//保存成功
}else{
AjaxUtil.printToString(response, ""+0);//保存失败
}
return null;
}
@RequestMapping(value="update_Student.do")
public String update(HttpServletRequest request,
HttpServletResponse response, Student st) {
int code=studentBiz.update(st);
if(code>0){
AjaxUtil.printToString(response, ""+1);//保存成功
}else{
AjaxUtil.printToString(response, ""+0);//保存失败
}
return null;
}
@RequestMapping(value="delById_Student.do")
public String delById(HttpServletRequest request,
HttpServletResponse response, Integer sid) {
int code=studentBiz.delById(sid);
if(code>0){
AjaxUtil.printToString(response, ""+1);//删除成功
}else{
AjaxUtil.printToString(response, ""+0);//删除失败
}
return null;
}
@RequestMapping(value="findById_Student.do")
public String findById(HttpServletRequest request,
HttpServletResponse response, Integer sid) {
Student oldst=studentBiz.findById(sid);
//转为json字符串
String jsonstr=JSONObject.toJSONString(oldst);
//在jsp页面使用$.getJSON('findById_Student.do?sid=1',function(json对象){})
System.out.println("jsonstr--->"+jsonstr);
//输出到客户端浏览器
AjaxUtil.printToString(response, jsonstr);
return null;
}
@RequestMapping(value="findPageAll_Student.do")
public String findPageAll(HttpServletRequest request,
HttpServletResponse response, Integer page, Integer rows) {
page=page==null?1:page;
rows=rows==null?5:rows;
if(rows>20)rows=20;//限定一页20条记录
//获取总记录数
int maxrow=studentBiz.findMaxRow();
int maxpage=1;
//获取总页数
if(maxrow>0){
maxpage=maxrow%rows==0?maxrow/rows:maxrow/rows+1;
}
System.out.println("maxpage--->"+maxpage);
//判断当前页数是否大于总页数
if(page>maxpage)page=maxpage;
//获取当前页记录集合
List<Student> lsst=studentBiz.findPageAll(page, rows);
//将分页数据设置到Map集合中
Map<String,Object> map=new HashMap<String, Object>();
map.put("page", page);
map.put("rows", rows);
map.put("maxpage", maxpage);
map.put("lsst", lsst);
//将map集合转为json字符串
String jsonstr=JSONObject.toJSONString(map);
System.out.println("jsonstr--->"+jsonstr);//在jsp页面使用$.getJSON('findById_Student.do?sid=1',function(json对象){})
AjaxUtil.printToString(response, jsonstr);//输出到客户端浏览器
return null;
}
@RequestMapping(value="doinit_Student.do")
public String doinit(HttpServletRequest request,
HttpServletResponse response) {
List<Clazz> lsca=studentBiz.doinit();
//将map集合转为json字符串
String jsonstr=JSONObject.toJSONString(lsca);
System.out.println("jsonstr--->"+jsonstr);//在jsp页面使用$.getJSON('findById_Student.do?sid=1',function(json对象){})
AjaxUtil.printToString(response, jsonstr);//输出到客户端浏览器
return null;
}
}
JSONObject是FastJson提供的对象,toJSONString()是其常用方法
JSONObject.toJSONString();将JSONObject对象转换为json的字符串
5、配置mybatis-config.xml文件,加入mapper文件的路径
在src根目录下新建XML(Basic Templates)命名为mybatis-config.xml,
在mybaties组件包里复制mybaties配置文档.txt到mybatis-config.xml并做对应修改
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="com/mapper/StudentMapper.xml" />
</mappers>
</configuration>
6、配置applicationContext.xml文件,注入数据源dataSoruce、mybatis的SqlSessionFactory和注入Spring的事务管理
打开“springmvc整合mybatis配置的applicationContext”文件,复制并做对应修改,在MyEclipse中配置数据库驱动Database Driver步骤和在applicationContext.xml中一键配置数据源见学生信息管理系统SSJ
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
"
default-autowire="byName"
>
<!-- 使用注解配置 -->
<context:annotation-config></context:annotation-config>
<!-- 扫描 -->
<context:component-scan base-package="com.mapper"></context:component-scan>
<context:component-scan base-package="com.biz"></context:component-scan>
<context:component-scan base-package="com.action"></context:component-scan>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://localhost:3306/studb">
</property>
<property name="username" value="root"></property>
<property name="password" value="java"></property>
</bean>
<!-- 创建SqlSessionFactory,同时指定数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 在mapper包扫描所有的sql映射文档xxxMapper.xml文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper" />
</bean>
<!-- JDBC事务管理 -->
<bean id="txmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="txmanager"/>
</beans>
7、配置springmvc-servlet.xml文件
在WEB-INF目录下新建springmvc-servlet.xml文件
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
"
default-autowire="byName"
>
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.action"></context:component-scan>
</beans>
8、配置web.xml文件加入Spring的启动和中文转码过滤器
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>student.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
在MyEclipse中部署项目并启动Tomcat测试 http://localhost:8080/prjMVC/findPageAll_Student.do
9、编写jsp视图测试
掌握Dream Weaver 8的使用
在WebRoot目录下新建js文件夹,导入jquery-1.9.1.js
student.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>学生管理系统</title>
<script type="text/javascript" src="js/jquery-1.9.1.js"></script> <!--导入jQuery--->
<script>
/***********初始化下拉列表框*************/
$(function(){
$("#btsave").show();
$("#btupdate").hide();
$.getJSON('doinit_Student.do',function(lsca){
for(var i=0;i<lsca.length;i++){
var clazz=lsca[i];
$("#classid").append("<option value="+clazz.cid+">"+clazz.cname+"</option>");
}
});
showAll();
});
/*****************************************/
/***********获取学生列表的方法************************/
var page=1;
var rows=5;
var maxpage=1;
function showAll(){
$.getJSON('findPageAll_Student.do?page='+page+'&rows='+rows+'&time='+new Date().getTime(),function(mappage){
//加入时间戳防止浏览器缓存
page=mappage.page;
rows=mappage.rows;
maxpage=mappage.maxpage;
var lsst=mappage.lsst;//获取map中的学生集合
var tableHead="<table width='800' border='1' align='center' cellpadding='1' cellspacing='0'>"
+"<tr align='center' bgcolor='#FFFFCC'>"
+"<td width='59'>编号</td>"
+"<td width='121'>姓名</td>"
+"<td width='77'>性别</td>"
+"<td width='146'>地址</td>"
+"<td width='108'>生日</td>"
+"<td width='122'>班级</td>"
+"<td width='137'>操作</td>"
+"</tr>";
var trrows="";
for(var i=0;i<lsst.length;i++){
var st=lsst[i];
trrows+="<tr align='center'>"
+"<td>"+st.sid+"</td>"
+"<td>"+st.sname+"</td>"
+"<td>"+st.sex+"</td>"
+"<td>"+st.address+"</td>"
+"<td>"+st.sdate+"</td>"
+"<td>"+st.cname+"</td>"
+"<td><input type='button' name='btdel' id='btdel' value='删除' onclick='dodel("+st.sid+")' />"
+"<input type='button' name='btfind' id='btfind' value='编辑' onclick='findById("+st.sid+")'/></td>"
+"</tr>";
}
var endtable=tableHead+trrows+"</table>";
$("#ttable").html(endtable);
//给分页的表格赋值
$("#rows").val(rows);
$("#page").val(page);
$("#pageLabel").html(page+"/"+maxpage+"页");
});
}
/*****************************************************/
/************************分页处理*****************************/
$(function(){
$("#btfirst").click(function(){
page=1;
//alert(page);
showAll();
});
$("#btup").click(function(){
page=page-1;
//alert(page);
if(page<1){
page=1;
}
showAll();
});
$("#btnext").click(function(){
page=page+1;
//alert(page);
if(page>maxpage){
page=maxpage;
}
showAll();
});
$("#btlast").click(function(){
page=maxpage;
//alert(page);
showAll();
});
$("#btchangerows").click(function(){
rows=$("#rows").val();
if(isNaN(rows)){
alert('请输入正确的数值!');
$("#rows").val(5);
return;
}
showAll();
});
$("#btchangepage").click(function(){
page=$("#page").val();
if(isNaN(rows)){
alert('请输入正确的数值!');
$("#page").val(1);
return;
}
showAll();
});
});
/*************************************************************/
/**********************保存方法*******************************/
$(function(){
$("#btsave").click(function(){
//获取表单元素的值
var sname=$("#sname").val();
var sex=$(":radio[name='sex']:checked").val();//获取选中的单选按钮值
var address=$("#address").val();
var sdate=$("#sdate").val();
var classid=$("#classid").val();
//组装为json对象准备传递给服务器save_Student路径对应的方法
var st={'sname':sname,'sex':sex,'address':address,'sdate':sdate,'classid':classid};
//发送json对象到服务器
$.post('save_Student.do',st,function(code){
if(code=='1'){
alert('保存成功!');
showAll();//刷新表格
}else{
alert('保存失败!');
}
});
});
});
/*************************************************************/
/**********************更新方法*******************************/
$(function(){
$("#btupdate").click(function(){
//获取表单元素的值
var sid=$("#sid").val();
var sname=$("#sname").val();
var sex=$(":radio[name='sex']:checked").val();//获取选中的单选按钮值
var address=$("#address").val();
var sdate=$("#sdate").val();
var classid=$("#classid").val();
//组装为json对象准备传递给服务器save_Student路径对应得方法
var st={'sid':sid,'sname':sname,'sex':sex,'address':address,'sdate':sdate,'classid':classid};
//发送json对象到服务器
$.post('update_Student.do',st,function(code){
if(code=='1'){
alert('更新成功!');
showAll();//刷新表格
}else{
alert('更新失败!');
}
});
$("#btsave").show();
$("#btupdate").hide();
});
});
/*************************************************************/
/********************删除事件************************************/
function dodel(sid){
var flag=window.confirm('是否真的删除!');
if(flag){
$.get('delById_Student.do?sid='+sid,function(code){
if(code=='1'){
alert('删除成功!');
showAll();//刷新表格
}else{
alert('删除失败!');
}
});
}
}
/*************************************************************/
/***********************查找的方法*****************************/
function findById(sid){
$.getJSON('findById_Student.do?sid='+sid+'&t='+new Date().getTime(),function(oldst){
//给表单元素赋值
$("#sid").val(oldst.sid);
$("#sname").val(oldst.sname);
$(":radio[value='"+oldst.sex+"']").attr("checked",true);
$("#address").val(oldst.address);
$("#sdate").val(oldst.sdate);
$("#classid").val(oldst.classid);
});
$("#btsave").hide();
$("#btupdate").show();
}
/************************************************************/
</script>
</head>
<body>
<p align="center">学生信息列表</p>
<hr />
<div id="ttable">
</div>
<table width="800" border="1" align="center" cellpadding="1" cellspacing="0">
<tr align="center" bgcolor="#FFFFCC">
<td>
<input type="button" name="btfirst" id="btfirst" value="首页" /></td>
<td>
<input type="button" name="btup" id="btup" value="上页" /></td>
<td>
<input type="button" name="btnext" id="btnext" value="下页" /></td>
<td>
<input type="button" name="btlast" id="btlast" value="末页" /></td>
<td>每页
<label for="rows"></label>
<input name="rows" type="text" id="rows" size="1" />
条记录
<input type="button" name="btchangerows" id="btchangerows" value="确定" /></td>
<td>跳转到第
<label for="page"></label>
<input name="page" type="text" id="page" size="1" />
页
<input type="button" name="btchangepage" id="btchangepage" value="确定" /></td>
<td><span id="pageLabel">1/1页</span></td>
</tr>
</table>
<hr />
<form id="form1" name="form1" method="post" action="">
<table width="450" border="1" align="center">
<tr>
<td colspan="2" align="center" bgcolor="#FFFFCC">学生管理</td>
</tr>
<tr>
<td width="66">姓名:</td>
<td width="368"><label for="sname"></label>
<input type="text" name="sname" id="sname" />
<input type="hidden" name="sid" id="sid" />
</td>
</tr>
<tr>
<td>性别:</td>
<td><input name="sex" type="radio" id="radio" value="男" checked="checked" />
<label for="sex">男
<input type="radio" name="sex" id="radio2" value="女" />
女</label></td>
</tr>
<tr>
<td>地址:</td>
<td><input type="text" name="address" id="address" /></td>
</tr>
<tr>
<td>生日:</td>
<td><input type="date" name="sdate" id="sdate" value="1995-01-01"/></td>
</tr>
<tr>
<td>班级:</td>
<td><label for="classid"></label>
<select name="classid" id="classid">
</select></td>
</tr>
<tr>
<td colspan="2" align="center" bgcolor="#FFFFCC"><input type="button" name="btsave" id="btsave" value="保存" />
<input type="button" name="btupdate" id="btupdate" value="更新" />
<input type="reset" name="btreset" id="btreset" value="重置" /></td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>