1:使用与和或来定义每个操作的权限,下面用二进制表示
增加:0001
删除:0010
修改:0100
1. 如果一个用户要有增加与修改权限,使用或:则为0000 | 0001 | 0100,结果他的权限则为0101
2. 查看一个用户是否有修改权限0100,使用与:0101 & 0100 为 0100,与的结果与修改权限的值一样,则此用户有修改权限。
3. 查看一个用户是否有删除权限0010,使用与:0101 & 0010 为 0000,与的结果与删除权限的值不一样,则此用户没有删除权限
2:在eclipse 中配置el表达式的使用;
解决:<%@ pageisELIgnored="false" %>
并且要求web.xml的web-app 的version=2.4以上;
3: 不能相信客户端的校验,服务器端仍要校验;
4:js对象的构造方法:var obj = {} ; var obj = new Object();
5:3.3. 使用通配符映射(wildcard mappings)方式:
在struts.xml文件中配置<action…>元素时,它的name、class、method属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。
当我们使用通配符定义Action的name属性时,相当于用一个元素action定义了多个逻辑Action:
<action name="user_*" class="org.qiujy.web.struts2.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> |
如上,<action name=”user_*”>定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式 {1},表示它的值是name属性值中第一个*的值。例如:用户请求URL为user_login.action时,将调用到UserAction类的 login方法;用户请求URL为user_regist.action时,将调用到UserAction类的regist方法
6:mysql 启动1067错误:my.ini文件配置错误
7:坑爹的mysql中文乱码问题:
网上解决办法:设置统一的数据库;表;字段编码;
查看数据编码格式:show variables like 'char%';
设置默认的编码格式:在my.ini文件的mysql 部分添加
default-character-set=utf8;(不然默认是瑞典文);
本次遇到的问题:在application.xml 的配置文件中的datasource 缺少对characterEncoding的设置;
解决: <property name="url"value="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8"></property>
8:spring 的注解:
配置bean注入:
Class xxx{
@autowired
Private Boss boss;
}
Class Boss{
}
<beanclass="org.springframework.beans.factory.annotation.
AutowiredAnnotationBeanPostProcessor"/>
若未找到autowaird的自动配置的bean时候会报异常:
这时候需要更改配置为@Autowired(required = false);
当出现两个可匹配的bean时:可以通过下面方法解决;
使用 @Qualifier 注释指定注入 Bean 的名称
@Autowired
public voidsetOffice(@Qualifier("office")Office office) {
this.office =office;
或者:
publicclass Boss {
@Autowired
private Car car;
@Autowired
@Qualifier("office")
private Office office;
…}
Dao的配置bean:@repository(“ xxxx”);
Service 的配置bean:@service(“xxxx”);
Service 注入dao :@autowired
Application 需要增加的配置:default-autowire=”true”
Struts 的action 配置注解:(需要添加struts2-convention-plugin-2.1.8.1.jar
)
@namespace(value=”/”)
@results({
@result(name = “success” ,value=”/success.jsp”),
@result(name=”faliure” ,value=”/failure.jsp”)
})
同时使用配置和注解:出错;
9:关于binernate的 二级缓存机制:
一级:session :二级sessionFactory
注意点1:
财务数据等是非常重要的数据,绝对不允许出现或使用无效的数据,所以此时为了安全起见最好不要使用二级缓存。
因为此时 “正确性”的重要性远远大于 “高性能”的重要性;
10: Write operations are not allowed inread-only mode (FlushMode.NEVER/MANUAL): Turn your Session intoFlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
问题:在application.xml 中配置了事务处理;注意查看自己的方法名和配置的是否一致
11:dwr 提供的清空下拉框的方法:
DWRUtil.removeAllOptions(select_menu1);
12:load 与get的比较
Session.load(class,id);
Session.get(class,id);
遇到结果集为空的情况:load抛出异常;get返回null;
Load支持延迟加载;get不支持;
比如session.load(class,id),只要到用到结果的时候才会发出一条sql;
13:生成id策略:
Increament:在集群情况下会出现id不唯一;
Sequence :当整合两个数据库文件时候肯能出现id不唯一;
。。。建议使用uuid:32bit
14:jquery动态添加html:
$(‘#id’).append(“<div></div>”);
$(‘#id’).html(“<div></div>”)
15:关于hibernate datasource部分配置
Hibernate自带的连接池算法相当不成熟. 它只是为了让你快些上手,并不
适合用于产品系统或性能测试中。 出于最佳性能和稳定性考虑你应该使用第三
方的连接池。只需要用特定连接池的设置替换 hibernate.connection.pool_size
即可。这将关闭Hibernate自带的连接池. 例如, 你可能会想用C3P0
注意需要添加:c3p0.jar包
<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass"value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/financemanager"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="root"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="root"/>
<!--初始化时获取连接的个数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="3" />
<!--连接池中保留的最小连接数。-->
<property name="minPoolSize" value="3" />
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="50" />
<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="600" />
<!--用以控制数据源内加载的PreparedStatements数量(一般在100),maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->
<property name="maxStatements" value="100" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="3" />
</bean>
16:关于tranction(事务)
配置好事务;然后按配置好的事务创建规则的方法;在方法内的的所以插入更新操作均将受到事务的约束;
17:struts 配置防止重复提交的拦截器token
<action >
<interceptor-ref name=”token” />
<result name=”invalid.token”>/…./xx.jsp</token>//重复提交跳转到。。。
</action>
18:联想控件实现联动:
配置属性:whereConditionFunc: xxx
Function xxx(){
Return “ conditionxxx = param ”;
}
19:注意在做删除的时候如果遇到是多表的话、不能直接调用框架的信息;如果要做删除只能自己写方法处理;先把当前记录下的所有记录删除才可以删除本条记录;不然会提示你先保存在删除;
20:关于如何在hibernate中使用jdbc
1:获得当前session :super.getHibernateTemplate().getSessionFactory().getCurrentSession()
2:获得connection :session.connection;
3:获得statement:connection.prepareStatement(sql);
4:获得result: statement.executeQuery();
21:JTA 和jdbc的transaction 区别
JTA 可以跨多个session
Jdbc 只能在一个session中(因为jdbc中transaction的声明: Transaction tr = session.beginTransaction())
22:如何调用存储过程
1.
Sessionsession = super.getHibernateSession().getSessionFactory().getCurrentSession();
Connection con = (Connection)session.connection();
try {
CallableStatement proc =(CallableStatement) con.prepareCall("{ call SP_MATCH_CRM_CUST(?)}");
proc.registerOutParameter(1, Types.VARCHAR);
proc.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.
CallableStatement proc=null;
proc=myConnection.prepareCall("{callxs_proc(?,?)}";
proc.setString(1,"zhangsan");
proc.registerOutParameter(2,Types.NUMERIC);
proc.execute();
Stringteststring=proc.getString(2);
System.out.println(teststring);
22:利用隐藏域提交值时可能出现的错误:
1: 在刷新编辑区域时可能丢失隐藏域的值;
解决办法:在beforesave中直接对隐藏域设值;
23:hql 语句的组装
hql.append(“ ”).append(“”);
24:BigDecimal :做计算的时候比float 和double 精确;
BigDecimal.add();
25: eclipse 的几个快捷键
ctrl + q :回到编辑的地方;
Ctrl+shift+R :对变量进行重命名;
Ctrl+2 +L :生成变量名
Ctrl+1 :?
Ctrl+T:跳到实现类;
26:断点的属性设置:右键断点的圆点:breakPoint properties
设置在改点遇到属性等于?的时候停下;
打开display 窗口-》可以在窗口中对断点处变量的值进行设置;
如果想要对service进行调试:可以利用dwr页面加断点调试;
27:DWR 设置下拉框
DWRUtil.removeAllOptions("regionCode2");
DWRUtil.addOptions("regionCode2",[ { name:" ", id:" " }],"name","id");
DWRUtil.addOptions("regionCode2", dataList, "regionCode", "regionName");
28:将string 写入到json返回到页面
Public voidwriteJson(HttpServletResponse response,String str){
Try{
response.setContentType(“application/json;charset=utf-8”);
response.getWrite().write(str);
response.getWrite().flush();
}catch(Exception e){
e.printstatictrance();
}
}
29:jsonconfig的使用
通过jsonconfig实例,对包含和需要排除的属性进行方便的添加或删除
sonConfig jsonConfig = new JsonConfig();
jsonConfig.setExclusions( new String[]{"address"});
Person bean = new Person("jack","li");
JSON json = JSONSerializer.toJSON(bean, jsonConfig);
30:
String records=JSONArray.fromObject(page.getList(),jsonConfig).toString();
//原理:JSONArray.fromObject(object)将数组或链表解析成其对象的json字符串时,利用所装载的对象的get方法来构造字符串,
31:关于如何解析excel:
需要两个包:poi 和jxl
a:获得输入流
Workbook wb =Workbook.getWorkbook(new File(“excel file”));
//获得地一个工作区域
Sheet sheet = wb.getSheet(0);
//获得第一个单元格
Cell cell1 = sheet.getCell(0,0);
String str = cell1.getContents();
32:关于如何判断读取的excel是否为最后已行/列
Currposition//是当前位置
CurrPosition>sheet.getLastRowNum();
获得列数
//根据行数取得sheet 的一行
HSSFRow rowline = sheet.getRow(row);
Int filledColumns =rowline.getLastCellNum();
//获取当前cell
Cell = rowline.getCell((short)i);
33: linux 的登录日志放在var/log文件下
Who :显示当前登录的每个用户
34:退出vi 插入模式
Ctrl +c
35:linux 如何查看主机名
Hostname
36:linux 查看ip
Ifconfig
37:vi中设置行号
set nu
vi 移动到某一行
移动到12行40字符
先按50G 然后40->
查找某字符
/xxx
38:所有service的引用要配置到引用中。否则会导致容器识别不到serveice
从而出现空指针异常;(很傻的错误:贪图省事直接用new 一个service ,然后应用,爆汗)
38:学会使用断点的跟踪和异常堆栈的查看(很重要)
39:QueryInfo 的使用:
1:创建QueryInfo 对象
QueryInfoinfo = new QueryInfo(Object.class);
2:设置查询值是否按分页(list 不分页)
Info.setListType(QueryInfo.LISTTYPE_LIST);
3:设置要查询的字段以及字段值(可以设置多条件查询)
Field field = new Field(TmsOrderDomain.custCode);//设置查询的字段
Field.setCondition(Field.CONDITION_EQ);//设置查询的条件eg:”=”
Field.setFieldValue(custCode);//设置查询字段的值
4:将查询条件加到queryinfo 中
Info.addField(field1);
5:查询
List<TmsOrder> tmsOrderList = (List<TmsOrder>)QueryHandle.findByQuery(info);