1.在填写表单时需要进行日期、数字等校验,这可以用jQuery easyUI来实现,非常方便。
使用jquery easyui时需导入类似jquery-easyui-1.3.1的包,然后在jsp页面引入相应的文件,一般来说是4个。
<!-- 先引入jquery核心文件,剩下的引入顺序就无所谓 -->
<script type="text/javascript" charset="utf-8" src="js/jquery-easyui-1.3.1/jquery-1.8.0.min.js"></script>
<!-- 引入easy_ui的css样式文件 -->
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.3.1/themes/default/easyui.css" target="_blank" rel="external nofollow" >
<!-- 引入easy_ui的js -->
<script type="text/javascript" charset="utf-8" src="js/jquery-easyui-1.3.1/jquery.easyui.min.js"></script>
<!-- 引入国际化文件 -->
<script type="text/javascript" charset="utf-8" src="js/jquery-easyui-1.3.1/locale/easyui-lang-zh_CN.js"></script>
2.上传时需注意两点,method="post"和enctype="multipart/form-data".
3.BaseDao是一个最基本的接口,里边定义了增删改查数据库的方法,使用时直接继承就好了。如:
public interface BaseDao<Entity> {//Entity也可以换成其他值,一般换为T,然后所有的Entity都换成T才可以,泛型的一种写法
void save(Entity entity) throws Exception;//保存
void view(Entity entity) throws Exception;//展示
void update(Entity entity) throws Exception;//更新
void delete(int id) throws Exception;//根据id删除指定数据
Entity findById(int id) throws Exception;//根据id查询指定记录
List<Entity> findAll() throws Exception;//查询所有记录
}
4.
ParameterizedType pz = (ParameterizedType) this.getClass().getGenericSuperclass();
//利用反射返回当前类的父类的类型,并强制转换
5.BaseDaoImpl中有
String methodName = "get" + fs[i].getName().substring(0,1).toUpperCase()+ fs[i].getName().substring(1);
String methodName = "get" + Character.toUpperCase(fs[i].getName().charAt(0))+ fs[i].getName().substring(1);
这两句是等效的。
6.若想获取request,可用类似下边的方法
SamrtUpload su = new SmartLoad();
Request req = su.getRequest();
7.String型转化为int型
int id = Integer.parseInt(request.setParameter("id"));
//因为request.setParameter()获取的都为string类型
8.若想让表的自增索引从0开始,则可以用
truncate 表名;这相当于删除表重建
9.传递方法时不用打单引号或双引号,否则会找不到该方法.如:
<form action="UserServlet?method=save">;//正确
<form action="UserServlet?method='save'">;//可能会出错
10.根据id删除时
String sql = "delete from " + clazz.getSimpleName() + " where id = " + id;//注意空格
" where id = "的id后不能加问号,因为后边已经有了变量值,不用占位
查找时
String sql = "select * from " + clazz.getSimpleName() + " where id= ? ";
而这" where id= ? "需加问号,因为要占位
11.el表达式中,如果要做判断某值是否为空,可以用
<c:if test="${user.path ne null }">//ne表示不相等
<c:if test="${user.path eq null }">//eq表示相等
12.在使用Myeclipse时也遇到问题,就是以前只要一开启服务器,界面就自动跳转到console控制台,今天不知啥原因不跳了,网上查了才知道,在Window-preferences-Run/Debug-Console,下边有两个show选项,"Show when program writest to standard out"和"Show when program writes to standard error,都勾上时就会自动跳转,不选择就不跳。
13.关于basePath和realPath
SmartUpload su = new SmartUpload();//新建上传下载对象,对,smartUpload也可以下载
File file = su.getFiles().getFile(0);获取上传的文件,因为只上传了一个文件,所以为0
ServletContext sc = new ServletContext();//获取ServletContext对象,该对象用于共享数据
String basePath = sc.getRealPath("/upload");//定义文件上传位置
//输出的basePath为E:\Program Files\apache-tomcat-6.0.14\webapps\upload\upload
//其中第一个upload为项目名称,第二个upload为上传的位置。虽然想把文件上传至项目的文件夹中
//但上传至服务器是无争议的,因为tomcat就是服务器,所以会上传到那个位置
String realPath = basePath + "/" + UUID.randomUUID().toString() + file.getFileName();//假设文件名为001.jpg
//打印出的realPath为E:\Program Files\apache-tomcat-6.0.14\webapps\upload\upload/b9e47b6b-c656-41f0-a1c2-828087a011ad001.jpg
//加UUID是为了防止文件重名
14.下面贴两段代码,以后可以直接拿来用
①BaseDaoImpl中的代码,利用反射获取方法,注意里边的注释
/**
* 利用反射获取
*
*/
package com.bjsxt.base;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.bjsxt.util.DBUtil;
public class BaseDaoImpl<Entity> implements BaseDao<Entity> {
protected Class clazz;
public BaseDaoImpl(){
ParameterizedType pz = (ParameterizedType) this.getClass().getGenericSuperclass();
//利用反射返回当前类的父类的类型,并强制转换
clazz = (Class) pz.getActualTypeArguments()[0];
//返回此类型实际类型参数的Type对象数组的第一个
//这两步的作用就是获取父类泛型参数的实际类型
//System.out.println(clazz + "这是测试代码,打印出来的");
//打印得出clazz为class com.bjsxt.po.User
}
@Override
public void save(Entity entity) throws Exception {
Connection conn = DBUtil.getConn();//连接数据库
String sql = "insert into " + clazz.getSimpleName() + " values(null";
Field[] fs = clazz.getDeclaredFields();
for (int i = 1; i < fs.length; i++) {//这里要注意i要从1开始,因为数据库下标是从1开始,否则会出问题
sql += ",?";
}
sql = sql + ")";
PreparedStatement ps = DBUtil.getPs(conn, sql);
//user.setUsername(rs.getString("username"));
for (int i = 1; i < fs.length; i++) {//这里也要注意i要从1开始
String methodName = "get" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
//也可写为String methodName = "get" + fs[i].getName().substring(0,1).toUpperCase()+ fs[i].getName().substring(1);
//假如有个实体user类,含有uname属性,则获取uname的方法默认会为getUname(),会将uname的首字母大写,其余不变
//Character.toUpperCase就是将字符大写,然后将除首字母以外的截取出来,拼到一起,构成类似于getUname()的方法
//user.setUsername(uForm.getUsername);
//该处用get是因为要把对象保存进数据库里,用get获取属性
Method m = clazz.getDeclaredMethod(methodName);
ps.setObject(i,m.invoke(entity));
//setObject用来给"?"赋值。invoke则是在不知道具体类的情况下利用字符串去调用方法
//正常情况下是user.getUsername,m.invoke(entity)中m是一个方法,类似于getUsername(),entity相当于user.
//invoke是从实体里边找方法,那句话的意思就是从实体里边调用方法
}
ps.executeUpdate();
DBUtil.close(ps);
DBUtil.close(conn);
}
@Override
public void view(Entity entity) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void update(Entity entity) throws Exception {
Connection conn = DBUtil.getConn();
String sql = "update " + clazz.getSimpleName() + " set ";//注意这儿的set两旁的空格,否则会出错,蛋疼
Field[] fs = clazz.getDeclaredFields();
for (int i = 1; i < fs.length; i++) {//下标从1开始
sql += fs[i].getName() + " = ?,";
}
sql = sql.substring(0,sql.length()-1) + " where id = ?"; //减去最后的逗号
PreparedStatement ps = DBUtil.getPs(conn, sql);
for (int i = 1; i < fs.length; i++) {//注意下标从1开始
String methodName = "get" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
System.out.println(methodName+"这是methodName");
Method m = clazz.getDeclaredMethod(methodName);
ps.setObject(i, m.invoke(entity));
}
Method getId = clazz.getDeclaredMethod("getId");//更新需要知道id
ps.setInt(fs.length, (Integer) getId.invoke(entity));//因为id在sql语句最后一个问号处,所以要用fs.length
ps.executeUpdate();
DBUtil.close(ps);
DBUtil.close(conn);
}
@Override
public void delete(int id) throws Exception {
Connection conn = DBUtil.getConn();
//String sql = "delete from " + clazz.getSimpleName() + " where id = ?" + id;
//上句为错误写法,不能加问号,因为后边已经有了变量值,不用占位
String sql = "delete from " + clazz.getSimpleName() + " where id = " + id;
PreparedStatement ps = DBUtil.getPs(conn, sql);
ps.executeUpdate();
DBUtil.close(ps);
DBUtil.close(conn);
}
@Override
public Entity findById(int id) throws Exception {
Connection conn = DBUtil.getConn();
String sql = "select * from " + clazz.getSimpleName() + " where id= ? ";
PreparedStatement ps = DBUtil.getPs(conn, sql);
ps.setInt(1,id);
ResultSet rs = ps.executeQuery();
Entity entity = (Entity) clazz.newInstance();//利用无参构造函数新建实例
Field[] fs = clazz.getDeclaredFields();
if(rs.next()){
for (int i = 0; i < fs.length; i++) {
String methodName = "set" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
Method m = clazz.getDeclaredMethod(methodName, fs[i].getType());
m.invoke(entity, rs.getObject(fs[i].getName()));
}
}
DBUtil.close(rs);
DBUtil.close(ps);
DBUtil.close(conn);
return entity;
}
@Override
public List<Entity> findAll() throws Exception {
Connection conn = DBUtil.getConn();
String sql = "select * from " + clazz.getSimpleName();
PreparedStatement ps = DBUtil.getPs(conn, sql);
ResultSet rs = ps.executeQuery();
List<Entity> enList = new ArrayList<Entity>();
while(rs.next()){
Entity en = (Entity) clazz.newInstance();
//user.setUsername(rs.getString("username"));
Field[] fs = clazz.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
String methodName = "set" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
Method m = clazz.getDeclaredMethod(methodName, fs[i].getType());
m.invoke(en, rs.getObject(fs[i].getName()));
}
enList.add(en);
}
DBUtil.close(rs);
DBUtil.close(ps);
DBUtil.close(conn);
return enList;
}
}
②利用SmartUpload控制上传下载的servlet
package com.bjsxt.action;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bjsxt.dao.UserDao;
import com.bjsxt.dao.impl.UserDaoImpl;
import com.bjsxt.po.User;
import com.jspsmart.upload.File;
import com.jspsmart.upload.Request;
import com.jspsmart.upload.SmartUpload;
public class UserServlet extends HttpServlet {
private UserDao udao = new UserDaoImpl();//这条不能忘,很重要
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 method = request.getParameter("method");
if("save".equals(method)){
this.save(request,response);
}else if("view".equals(method)){
this.view(request,response);
}else if("preUpdate".equals(method)){
this.preUpdate(request,response);
}else if("delete".equals(method)){
this.delete(request,response);
}else if("update".equals(method)){
this.update(request,response);
}else if("download".equals(method)){
this.download(request,response);
}
}
/**
* 添加用户信息
* @param request
* @param response
*/
private void save(HttpServletRequest request, HttpServletResponse response) {
try {
//1.创建上传下载对象
SmartUpload su = new SmartUpload();
//2.初始化上传下载
su.initialize(this.getServletConfig(),request,response);
//3.设置上传的限制内容
su.setMaxFileSize(400000);//单个文件的最大上传大小
su.setTotalMaxFileSize(100000000);//总上传文件大小
su.setAllowedFilesList("jpeg,png,jpg,gif");//设置限制的文件类型
su.setDeniedFilesList("exe,doc,ppt");//设置不允许上传的文件类型
//4.开始上传
su.upload();
File file = su.getFiles().getFile(0);//获取上传的文件,因为只上传了一个文件,所以为0
String realPath = null;//文件上传的真实路径
if(file.getSize()>0){
ServletContext sc = this.getServletContext();//得到servletContext实例
String basePath = sc.getRealPath("/upload");
//获取上传的绝对路径,因为上传至web服务器的虚拟路径
/******************************************************************/
System.out.println("bathPath为" + basePath);
//输出为E:\Program Files\apache-tomcat-6.0.14\webapps_upload_upload
realPath = basePath + "/" + UUID.randomUUID().toString() + file.getFileName();
System.out.println("realPath为" + realPath);
//打印为E:\Program Files\apache-tomcat-6.0.14\webapps_upload_upload/c402cc92-7644-4259-8232-22dd8c63605e1hhWO.gif
/******************************************************************/
file.saveAs(realPath);//将文件换名另存
}
Request req = su.getRequest();
String uname = req.getParameter("username");
String pwd = req.getParameter("pwd");
String salary = req.getParameter("salary");
String birthday = req.getParameter("birthday");
//String path = req.getParameter("path");
User user = new User();
user.setUsername(uname);
user.setPwd(pwd);
user.setSalary(salary);
user.setBirthday(birthday);
user.setPath(realPath);//这一步也必须有,否则图片存不进数据库
this.udao.save(user);//将所加信息保存到对象中
response.sendRedirect("UserServlet?method=view");//将结果发送到展示页面一律用sendRedirect
//注意这里不是发送到user_view.jsp,而是发送到本UserServlet的view方法,而且view不能打单引号,血的教训
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 展示用户信息
* @param request
* @param response
*/
private void view(HttpServletRequest request, HttpServletResponse response) {
try{
//List<User> ulist = new ArrayList<User>();
//不能这样写,否则ulist会永远是空值
List<User> ulist = this.udao.findAll();//正确的写法是这样
request.setAttribute("ulist",ulist);//将对象添加到作用域中
request.getRequestDispatcher("user_view.jsp").forward(request, response);
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 预修改
* @param request
* @param response
*/
private void preUpdate(HttpServletRequest request,HttpServletResponse response) {
try {
User user = this.udao.findById(Integer.parseInt(request.getParameter("id")));
request.setAttribute("user",user);
request.getRequestDispatcher("user_update.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
private void update(HttpServletRequest request, HttpServletResponse response) {
try {
//1:第一次save没有上传照片,这次修改也没有上传照片
//2:第一次save没有上传照片,这次上传了照片(smartupload)
//3:第一次save上传照片了 ,这次没有上传照片
//4:第一次save上传照片了,这次也上传了(smartupload[新上传的会把旧的覆盖掉])
//1.创建上传下载对象
SmartUpload su = new SmartUpload();
//2.初始化上传下载
su.initialize(this.getServletConfig(),request, response);
//3设置上传的限制内容
su.setMaxFileSize(100000); //单个文件的最大上传限制
su.setTotalMaxFileSize(500000); //总文件上传最大限制
su.setAllowedFilesList("doc,txt,jpg,png,gif"); //允许上传文件的类型
su.setDeniedFilesList("exe,bat,html,htm,,");//不允许上传文件的类型
//4开始上传
su.upload();
Request req = su.getRequest();
String id = req.getParameter("id");
String uname = req.getParameter("username");
String salary = req.getParameter("salary");
String birthday = req.getParameter("birthday");
User user = this.udao.findById(Integer.parseInt(id));
String realPath = user.getPath();//之前数据库里的图片路径
System.out.println("之前数据库的图片路径realPath为"+realPath);
File file = su.getFiles().getFile(0);
if(file.getSize()>0){
if(realPath!=null){
java.io.File f = new java.io.File(realPath);
if(f.exists()){
f.delete();
}
}
ServletContext sc = this.getServletContext();
//String basePath = sc.getRealPath(realPath);//错误写法,找这个快蛋碎而亡了
String basePath = sc.getRealPath("/upload");//这才是正确的写法
System.out.println("/************************************************/");
System.out.println(realPath);
realPath = basePath + "/" + UUID.randomUUID().toString() + file.getFileName();
System.out.println("/************************************************/");
System.out.println(realPath);
file.saveAs(realPath);
}
user.setBirthday(birthday);
user.setUsername(uname);
user.setSalary(salary);
user.setPath(realPath);//注意该处为realPath
this.udao.update(user);//注意此处为update,不是save
response.sendRedirect("UserServlet?method=view");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除方法
* @param request
* @param response
*/
private void delete(HttpServletRequest request, HttpServletResponse response) {
try {
String id = request.getParameter("id");
//System.out.println(id);
this.udao.delete(Integer.parseInt(id));
response.sendRedirect("UserServlet?method=view");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下载照片
* @param request
* @param response
*/
private void download(HttpServletRequest request,HttpServletResponse response) {
try {
String path = request.getParameter("path");
String imageName = new String("照片".getBytes("utf-8"),"iso-8859-1");
//如果需要文件名中附加中文,需要转码
imageName += path.substring(path.lastIndexOf("."));
//拼接带中文的文件名,以后只要下载,就只有一种默认的文件名"照片.jpg"或"照片.bmp"等
//设置response对象的响应头内容
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "anttachment;filename="+imageName);
//写出图片
FileInputStream fis = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int temp = 0;
byte[] bs = new byte[256];//设置缓存大小
while((temp=fis.read(bs))!=-1){
os.write(bs,0,temp); //写出文件
}
fis.close();
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
说在最后边的,这代码还是得多练,虽然现在很蛋疼吐血。