tags: SSH整合与阅读项目
删除数据
实际业务中真正意义上的数据删除操作比较少见,多数情况是在数据中设置标记,通过标记的值来区分该数据是否可以用,而不是将数据真正的删除。
根据业务需求,为数据添加标记位,同时对数据的维护中添加启用/停用切换按钮,用于替换删除业务。所有的查询操作默认携带条件值为标记为可以的数据。除特殊业务外,标记为不可用的数据将不参与日常数据操作。
javaScript数值数据操作
javascript中如果需要对页面组件获取的值进行数字加操作,必须保障两个操作数据都是数字,否则将进行字符串连接运算。此处使用*1操作,将字符串快速转换为数字格式
代码生成器
由于我们的Dao、Service、Controller、配置文件都有很多重复的地方,我们可以通过“代码生成器”来将我们的文件生成出来。
- 主要是依靠反射和IO的技术来进行生成对应的文件
- 我个人认为它不够通用、如果使用SSM来进行开发的话,那这段代码的用处就不大了,并且还要遵循它固有的习惯开发。
- 主要是看看原来还能有这种操作!
package cn.itcast.erp.util.generator;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import cn.itcast.erp.invoice.operdetail.vo.OperDetailModel;
public class GeneratorUtil {
private Class clazz;
private String b ; //Emp
private String l ; //e
private String s ; //emp
private String pkg ; //cn.itcast.erp.auth.emp
private String dir ; //cn/itcast/erp/auth/emp/vo
public static void main(String[] args) throws Exception {
//EmpModel,RoleModel,ResModel,MenuModel
//SupplierModel,GoodsTypeModel,GoodsModel
//OrderModel,OrderDetailModel
//StoreModel,StoreDetailModel,OperDetailModel
new GeneratorUtil(OperDetailModel.class);
System.out.println("struts.xml未进行映射");
System.out.println("HbmXml未添加关联关系");
System.out.println("QueryModel未添加自定义范围查询条件");
System.out.println("DaoImpl中未对自定义查询条件形式条件设置");
}
public GeneratorUtil(Class clazz) throws Exception{
this.clazz = clazz;
//生成所有的内容
//-1.数据初始化
dataInit();
//0.创建目录
generatorDirectory();
//1.QueryModel
generatorQueryModel();
//2.Hbm.xml
generatorHbmXml();
//3.Dao
generatorDao();
//4.Impl
generatorImpl();
//5.Ebi
generatorEbi();
//6.Ebo
generatorEbo();
//7.Action
generatorAction();
//8.applicationContext.xml
generatorApplicationContextXml();
//9.struts.xml(选作)
//modifyStrutsXml();
}
private void modifyStrutsXml() throws Exception {
//1.读取原始的内容
//2.读取到特定位置(package)添加指定内容
//我们要读的文件与写的文件是同一个文件
/*
RandomAccessFile类读写文件时
读取,一共100,读70,写,写的内容会覆盖后30
111
222
333
444
在333的后面写5
111
222
333
544
在333的后面写5
111
222
333
555
*/
//方案一:
/*
读取原始文件,将内容写入新文件
写之前判断,读取的内容是否是特定内容,特定内容写之前,加入新的内容
写完毕之后生成了新的文件,删除老的文件,使用新文件更名为老的文件
*/
//方案二:
//1.读取原始文件的文件大小,字节总数1000
File f = new File("resources/struts.xml");
long len = f.length();
//2.创建一个字节数组,大小等于原始文件字节总数
byte[] buf = new byte[(int)len];
//3.将原始文件读入该byte数组
InputStream is = new FileInputStream(f);
is.read(buf);
is.close();
//4.将buf转化为字符串
String all = new String(buf);
//5.查找固定位置
int idx = all.lastIndexOf(" </package>");
//6.将要写入的内容插入该位置
String info = " <!-- "+b+" -->\r\n <action name=\""+s+"_*\" class=\""+s+"Action\" method=\"{1}\">\r\n </action>\r\n\r\n";
//7.将info加入all的指定位置
StringBuilder sbf = new StringBuilder(all);
sbf.insert(idx, info);
//8.将sbf中的组合最终内容写入struts.xml
FileOutputStream fos = new FileOutputStream(f);
fos.write(sbf.toString().getBytes());
fos.close();
}
//8.applicationContext.xml
private void generatorApplicationContextXml() throws Exception {
File f = new File("resources/applicationContext-"+s+".xml");
if(f.exists()){
return;
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
bw.newLine();
bw.write("<beans xmlns=\"http://www.springframework.org/schema/beans\"");
bw.newLine();
bw.write(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
bw.newLine();
bw.write(" xsi:schemaLocation=\"");
bw.newLine();
bw.write(" http://www.springframework.org/schema/beans ");
bw.newLine();
bw.write(" http://www.springframework.org/schema/beans/spring-beans.xsd");
bw.newLine();
bw.write(" \"> ");
bw.newLine();
bw.write(" <!-- Action -->");
bw.newLine();
bw.write(" <bean id=\""+s+"Action\" class=\""+pkg+".web."+b+"Action\" scope=\"prototype\">");
bw.newLine();
bw.write(" <property name=\""+s+"Ebi\" ref=\""+s+"Ebi\"/>");
bw.newLine();
bw.write(" </bean>");
bw.newLine();
bw.write(" <!-- Ebi -->");
bw.newLine();
bw.write(" <bean id=\""+s+"Ebi\" class=\""+pkg+".business.ebo."+b+"Ebo\">");
bw.newLine();
bw.write(" <property name=\""+s+"Dao\" ref=\""+s+"Dao\"/>");
bw.newLine();
bw.write(" </bean>");
bw.newLine();
bw.write(" <!-- Dao -->");
bw.newLine();
bw.write(" <bean id=\""+s+"Dao\" class=\""+pkg+".dao.impl."+b+"Impl\">");
bw.newLine();
bw.write(" <property name=\"sessionFactory\" ref=\"sessionFactory\"/>");
bw.newLine();
bw.write(" </bean>");
bw.newLine();
bw.write("</beans>");
bw.newLine();
bw.flush();
bw.close();
}
//7.Action
private void generatorAction() throws Exception {
File f = new File("src/"+dir+"/web/"+b+"Action.java");
if(f.exists()){
return;
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("package "+pkg+".web;");
bw.newLine();
bw.newLine();
bw.write("import java.util.List;");
bw.newLine();
bw.newLine();
bw.write("import "+pkg+".business.ebi."+b+"Ebi;");
bw.newLine();
bw.write("import "+pkg+".vo."+b+"Model;");
bw.newLine();
bw.write("import "+pkg+".vo."+b+"QueryModel;");
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseAction;");
bw.newLine();
bw.newLine();
bw.write("public class "+b+"Action extends BaseAction{");
bw.newLine();
bw.write(" public "+b+"Model "+l+"m = new "+b+"Model();");
bw.newLine();
bw.write(" public "+b+"QueryModel "+l+"qm = new "+b+"QueryModel();");
bw.newLine();
bw.newLine();
bw.write(" private "+b+"Ebi "+s+"Ebi;");
bw.newLine();
bw.write(" public void set"+b+"Ebi("+b+"Ebi "+s+"Ebi) {");
bw.newLine();
bw.write(" this."+s+"Ebi = "+s+"Ebi;");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" //列表");
bw.newLine();
bw.write(" public String list(){");
bw.newLine();
bw.write(" setDataTotal("+s+"Ebi.getCount("+l+"qm));");
bw.newLine();
bw.write(" List<"+b+"Model> "+s+"List = "+s+"Ebi.getAll("+l+"qm,pageNum,pageCount);");
bw.newLine();
bw.write(" put(\""+s+"List\", "+s+"List);");
bw.newLine();
bw.write(" return LIST;");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" //到添加");
bw.newLine();
bw.write(" public String input(){");
bw.newLine();
bw.write(" if("+l+"m.getUuid()!=null){");
bw.newLine();
bw.write(" "+l+"m = "+s+"Ebi.get("+l+"m.getUuid());");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.write(" return INPUT;");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" //添加");
bw.newLine();
bw.write(" public String save(){");
bw.newLine();
bw.write(" if("+l+"m.getUuid() == null){");
bw.newLine();
bw.write(" "+s+"Ebi.save("+l+"m);");
bw.newLine();
bw.write(" }else{");
bw.newLine();
bw.write(" "+s+"Ebi.update("+l+"m);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.write(" return TO_LIST;");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" //删除");
bw.newLine();
bw.write(" public String delete(){");
bw.newLine();
bw.write(" "+s+"Ebi.delete("+l+"m);");
bw.newLine();
bw.write(" return TO_LIST;");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write("}");
bw.newLine();
bw.flush();
bw.close();
}
//6.Ebo
private void generatorEbo() throws Exception {
File f = new File("src/"+dir+"/business/ebo/"+b+"Ebo.java");
if(f.exists()){
return;
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("package "+pkg+".business.ebo;");
bw.newLine();
bw.newLine();
bw.write("import java.io.Serializable;");
bw.newLine();
bw.write("import java.util.List;");
bw.newLine();
bw.newLine();
bw.write("import "+pkg+".business.ebi."+b+"Ebi;");
bw.newLine();
bw.write("import "+pkg+".dao.dao."+b+"Dao;");
bw.newLine();
bw.write("import "+pkg+".vo."+b+"Model;");
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseQueryModel;");
bw.newLine();
bw.newLine();
bw.write("public class "+b+"Ebo implements "+b+"Ebi{");
bw.newLine();
bw.write(" private "+b+"Dao "+s+"Dao;");
bw.newLine();
bw.write(" public void set"+b+"Dao("+b+"Dao "+s+"Dao) {");
bw.newLine();
bw.write(" this."+s+"Dao = "+s+"Dao;");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public void save("+b+"Model "+l+"m) {");
bw.newLine();
bw.write(" "+s+"Dao.save("+l+"m);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public void update("+b+"Model "+l+"m) {");
bw.newLine();
bw.write(" "+s+"Dao.update("+l+"m);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public void delete("+b+"Model "+l+"m) {");
bw.newLine();
bw.write(" "+s+"Dao.delete("+l+"m);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public "+b+"Model get(Serializable uuid) {");
bw.newLine();
bw.write(" return "+s+"Dao.get(uuid);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public List<"+b+"Model> getAll() {");
bw.newLine();
bw.write(" return "+s+"Dao.getAll();");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public List<"+b+"Model> getAll(BaseQueryModel qm, Integer pageNum,Integer pageCount) {");
bw.newLine();
bw.write(" return "+s+"Dao.getAll(qm,pageNum,pageCount);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public Integer getCount(BaseQueryModel qm) {");
bw.newLine();
bw.write(" return "+s+"Dao.getCount(qm);");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write("}");
bw.newLine();
bw.flush();
bw.close();
}
//5.Ebi
private void generatorEbi() throws Exception {
File f = new File("src/"+dir+"/business/ebi/"+b+"Ebi.java");
if(f.exists()){
return;
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("package "+pkg+".business.ebi;");
bw.newLine();
bw.newLine();
bw.write("import org.springframework.transaction.annotation.Transactional;");
bw.newLine();
bw.newLine();
bw.write("import "+pkg+".vo."+b+"Model;");
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseEbi;");
bw.newLine();
bw.newLine();
bw.write("@Transactional");
bw.newLine();
bw.write("public interface "+b+"Ebi extends BaseEbi<"+b+"Model>{");
bw.newLine();
bw.newLine();
bw.write("}");
bw.newLine();
bw.flush();
bw.close();
}
//4.Impl
private void generatorImpl() throws Exception {
File f = new File("src/"+dir+"/dao/impl/"+b+"Impl.java");
if(f.exists()){
return;
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("package "+pkg+".dao.impl;");
bw.newLine();
bw.newLine();
bw.write("import org.hibernate.criterion.DetachedCriteria;");
bw.newLine();
bw.write("import org.hibernate.criterion.Restrictions;");
bw.newLine();
bw.newLine();
bw.write("import "+pkg+".dao.dao."+b+"Dao;");
bw.newLine();
bw.write("import "+pkg+".vo."+b+"Model;");
bw.newLine();
bw.write("import "+pkg+".vo."+b+"QueryModel;");
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseImpl;");
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseQueryModel;");
bw.newLine();
bw.newLine();
bw.write("public class "+b+"Impl extends BaseImpl<"+b+"Model> implements "+b+"Dao{");
bw.newLine();
bw.newLine();
bw.write(" public void doQbc(DetachedCriteria dc,BaseQueryModel qm){");
bw.newLine();
bw.write(" "+b+"QueryModel "+l+"qm = ("+b+"QueryModel)qm;");
bw.newLine();
bw.write(" // TODO 添加自定义查询条件");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write("}");
bw.newLine();
bw.flush();
bw.close();
}
//3.Dao
private void generatorDao() throws Exception {
File f = new File("src/"+dir+"/dao/dao/"+b+"Dao.java");
if(f.exists()){
return;
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("package "+pkg+".dao.dao;");
bw.newLine();
bw.newLine();
bw.write("import "+pkg+".vo."+b+"Model;");
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseDao;");
bw.newLine();
bw.newLine();
bw.write("public interface "+b+"Dao extends BaseDao<"+b+"Model> {");
bw.newLine();
bw.newLine();
bw.write("}");
bw.newLine();
bw.flush();
bw.close();
}
//2.Hbm.xml
private void generatorHbmXml() throws Exception {
//1.创建文件
File f = new File("src/"+dir+"/vo/"+b+"Model.hbm.xml");
if(f.exists()){
return;
}
f.createNewFile();
//2.IO写入内容
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
bw.newLine();
bw.write("<!DOCTYPE hibernate-mapping PUBLIC");
bw.newLine();
bw.write(" '-//Hibernate/Hibernate Mapping DTD 3.0//EN'");
bw.newLine();
bw.write(" 'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>");
bw.newLine();
bw.write("<hibernate-mapping>");
bw.newLine();
bw.write(" <class name=\""+pkg+".vo."+b+"Model\" table=\"tbl_"+s+"\">");
bw.newLine();
bw.write(" <id name=\"uuid\">");
bw.newLine();
bw.write(" <generator class=\"native\" />");
bw.newLine();
bw.write(" </id>");
bw.newLine();
//hibernate的映射配置文件中要对原始模型类中的属性进行配置,反射获取所有字段
Field[] fds = clazz.getDeclaredFields();
for(Field fd:fds) {
//如果字段的修饰符是private,生成
if(fd.getModifiers() == Modifier.PRIVATE && !fd.getName().equals("uuid")){
//如果是关联关系不生成,不是关联关系(Long,Integer,Double,String)
if( fd.getType().equals(String.class)||
fd.getType().equals(Long.class)||
fd.getType().equals(Integer.class)||
fd.getType().equals(Double.class)
){
if(!fd.getName().endsWith("View")){
bw.write(" <property name=\""+fd.getName()+"\"/>");
bw.newLine();
}
}
}
}
bw.write(" </class>");
bw.newLine();
bw.write("</hibernate-mapping>");
bw.newLine();
bw.flush();
bw.close();
}
//1.QueryModel
private void generatorQueryModel() throws Exception {
//1.创建文件
File f = new File("src/"+dir+"/vo/"+b+"QueryModel.java");
//判断:如果该文件存在,终止操作
if(f.exists()){
return;
}
f.createNewFile();
//2.IO写入内容
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("package "+pkg+".vo;");
bw.newLine();
bw.newLine();
bw.write("import cn.itcast.erp.util.base.BaseQueryModel;");
bw.newLine();
bw.newLine();
bw.write("public class "+b+"QueryModel extends "+b+"Model implements BaseQueryModel{");
bw.newLine();
bw.write(" // TODO 添加自定义查询条件");
bw.newLine();
bw.write("}");
bw.newLine();
bw.flush();
bw.close();
}
//0.创建目录
private void generatorDirectory() {
//business/ebi
// src+//cn.itcast.erp.auth.emp+business/ebi .vo
File f = new File("src/"+dir+"/business/ebi");
f.mkdirs();
//business/ebo
f = new File("src/"+dir+"/business/ebo");
f.mkdirs();
//dao/dao
f = new File("src/"+dir+"/dao/dao");
f.mkdirs();
//dao/impl
f = new File("src/"+dir+"/dao/impl");
f.mkdirs();
//web
f = new File("src/"+dir+"/web");
f.mkdirs();
}
//-1.数据初始化
private void dataInit() {
String className = clazz.getSimpleName(); //EmpModel
b = className.substring(0, className.length()-5); //Emp
String first = b.substring(0,1); //E
l = first.toLowerCase(); //e
s = l+b.substring(1); //emp
String rootPkg = clazz.getPackage().getName(); //cn.itcast.erp.auth.emp.vo
pkg = rootPkg.substring(0,rootPkg.length()-3); //cn.itcast.erp.auth.emp
dir = pkg.replace(".","/"); //cn/itcast/erp/auth/emp/vo
}
/*
public static void main(String[] args) throws Exception {
//核心工作原理:文件IO+反射
File f = new File("src/EmpAction.java");
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("public class EmpAction{}");
bw.flush();
bw.close();
}
*/
}
拦截器捕获异常
一般地,我们都是Dao、servcie层都把异常抛出,最后由Action来进行捕获。如果所有的Action都要捕获异常的话,那么就多了很多的重复代码。
因此,我们可以使用拦截器来进行统一捕获。
修改角色权限无法同步的问题
如果用户已经登录,此时修改登录用户的角色信息或角色对应的资源信息。由于用户的数据已经存在于Session中,无法及时进行数据同步。
解决方案:
在ServletContext范围内设置集合变量changeEmp,当管理员维护到某个员工的角色时,将该员工的OID放入该集合;
当管理员维护到某个角色的资源时,将该角色对应的所有员工OID放入该集合。
在登录校验时,获取完登录信息后,再次获取该集合,查看当前用户OID是否存在于该集合。如果存在于该集合中,清空当前登录人信息,将员工OID从集合中删除,同时跳转到登录界面。
- 将要修改的用户保存到集合中(记录被修改的用户)
- 等到校验的时候发现该用户是否被修改过(在集合中是否存在),如果存在,那么则强制注销,跳转回登陆页面
配置数据源
一般地,我们做开发都是直接使用tomcat来连接数据库,但是如果数据库的地址变化的时候,我们就要手动去修改连接的地址了。这样会造成一些不必要的麻烦。

所以,官方是推荐我们使用JNDI来配置数据源,使用JNDI来连接数据库的。这样即使数据库的地址变了,我们就不用手动去修改连接的地址。
步骤如下:
- 修改tomcat安装目录/conf/context.xml,添加如下配置
<Resource
name="jdbc/DataSource"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
url="jdbc:mysql://localhost:3306/erpdb"
driverClassName="com.mysql.jdbc.Driver"
username="root"
password="root"
/>
- 配置Web应用使用Tomcat数据源,修改WEB-INF/web.xml,添加如下配置
<resource-ref>
<res-ref-name>jdbc/DataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
- 接着来spring中配置我们的数据源,是从JNDI从查找出来的。

JNDI的命名,不同web服务器有不同的书写格式:
JNDI名是远端访问的通用名称,可以理解为使用该名称获取对应的资源信息。
JNDI的命名官方规范 java:comp/env/JNDI名称
Jboss java:JNDI名称
Weblogic JNDI名称
如果您觉得这篇文章帮助到了您,可以给作者一点鼓励
