第一次做项目的总结

来源:互联网 发布:linux查看oracle监听 编辑:程序博客网 时间:2024/05/09 23:48

1.先配置开发环境,然后测试开发环境是否可以正常运行


2.对资源文件进行分类,一般分为config(存放配置文件) test(存放测试代码)  src(存放功能代码) 三个source folder文件夹,前台显示层页面:静态资源放在web应用根目录下,可以被外界直接访问, 例如图片  js 静态页面 css,保存上传文件的目录最好不要直接放在根目录下,因为可以被外界直接访问(但可以用uuid重写文件名),将jsp文件放在WEB-INF下,可以避免被外界直接访问,想要访问这些页面只能使用redirect来访问。


3.这次使用的是ssh框架,因为使用了spring框架,所以并没有写hibernate的配置文件,spring配置文件可以引入其他配置文件: 

<span style="font-size:18px;"><import resource="classpath:cn/itcast/nsfw/*/conf/*-spring.xml"/>,</span>

并且所有的dao都需要使用session,所有写一个抽象父类注入sesion工厂,让其他所有的dao都继承此类:

<span style="font-size:18px;"><!-- 所有业务dao的parent -->    <bean id="baseDao" abstract="true">    <property name="sessionFactory" ref="sessionFactory"></property>    </bean></span>

4.spring配置中事务aop的配置:

<span style="font-size:18px;"><!-- aop配置被事务控制的类 -->    <aop:config>    <aop:pointcut id="serviceOperation" expression="bean(*Service)"/><!-- 扫描以Service结尾的bean --></span>
<span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif;">将事务控制在service层,这个表达式直接扫描所有以service结尾的bean,在action中调用时,是调用接口的引用</span></span></span>
<span style="font-size:18px;"><!--     <aop:pointcut id="serviceOperation" expression="execution(* cn.itcast..service.impl.*.*(..))"/> -->    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>    </aop:config></span>
<span style="font-size:18px;"></pre><pre name="code" class="html" style="font-size:24px;">还有一个完成的配置,转载至网络:</span>
<span style="font-size:18px;">声明式事务管理通过配置<tx:advice/>来定义事务属性,配置方式如下所示:</span>
<span style="font-size:18px;"><span style="white-space:pre"></span><tx:attributes>      <span style="white-space:pre"></span> <tx:method name="……"                           propagation=" REQUIRED"                           isolation="READ_COMMITTED"                            timeout="-1"                            read-only="false"                            no-rollback-for=""                           rollback-for=""/>  </tx:attributes>  </tx:advice>  </span>
<span style="font-size:18px;"><tx:advice>:id用于指定此通知的名字, transaction-manager用于指定事务管理器,默认的事务管理器名字为“transactionManager”;</span>
<span style="font-size:18px;"><tx:method>:用于定义事务属性即相关联的方法名;</span>
<span style="font-size:18px;">name:<span style="font-family: Arial, Helvetica, sans-serif;">定义与事务属性相关联的方法名,将对匹配的方法应用定义的事务属性,可以使用“*”通配符来匹配一组或所有方法,如“save*”将匹配以save开头的方法,而“*”将匹配所有方法;</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">pagation:事务传播行为定义,默认为“REQUIRED”,表示Required,其值可以通过TransactionDefinition的静态传播行为变量的“PROPAGATION_”后边部分指定,如“TransactionDefinition.PROPAGATION_REQUIRED”可以使用“REQUIRED”指定;</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">isolation:事务隔离级别定义;默认为“DEFAULT”,其值可以通过TransactionDefinition的静态隔离级别变量的“ISOLATION_”后边部分指定,如“TransactionDefinition. ISOLATION_DEFAULT”可以使用“DEFAULT”指定:</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">timeout:事务超时时间设置,单位为秒,默认-1,表示事务超时将依赖于底层事务系统;</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">read-only:事务只读设置,默认为false,表示不是只读;</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">rollback-for:需要触发回滚的异常定义,以“,”分割,默认任何RuntimeException 将导致事务回滚,而任何Checked Exception 将不导致事务回滚;异常名字定义和TransactionProxyFactoryBean中含义一样</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">no-rollback-for:不被触发进行回滚的 Exception(s);以“,”分割;异常名字定义和TransactionProxyFactoryBean中含义一样;</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"></span></span>
<span style="font-size:18px;">propagetion的属性(事务的传播行为)<span style="font-family: Arial, Helvetica, sans-serif;">:</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。</span></span>
<span style="font-size:18px;"> NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。     REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。</span>
<span style="font-size:18px;"> MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。</span>
<span style="font-size:18px;">SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。</span>
<span style="font-size:18px;">NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。</span>
<span style="font-size:18px;">NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。5.在配置sesionFactory时一起配置hibernate的配置信息:</span>
<span style="font-size:18px;"><!-- 配置session工厂 --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop><prop key="javax.persistence.validation.mode">none</prop></props></property><property name="mappingLocations"><list><value>classpath:cn/itcast/nsfw/*/entity/*.hbm.xml</value></span>
<span style="font-size:18px;"><span style="white-space:pre"></span><!-- 使用通配符来检索映射文件  --!><</list></property></bean></span>
<span style="font-size:18px;">6.抽取三层架构,把基本功能进行实现:例如持久层一定会有增删改查的功能,对其进行实现,然后让所有的dao都继承此类,业务层和控制层也是一样的道理。</span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;">7.*-struts.xml文件的配置:<package name="user-action" namespace="/nsfw" extends="struts-default"><action name="user_*" class="cn.itcast.nsfw.user.action.UserAction" method="{1}"><result name="{1}">/WEB-INF/jsp/nsfw/user/{1}.jsp</result><result name="list" type="redirectAction"><param name="actionName">user_listUI</param><param name="user.name">${strName}</param></span>
<span style="font-size:18px;">使用的是ognl表达式,从ognlContext中取出元素数据<param name="encode">true</param></span></span>
<span style="font-size:18px;"><对参数数据进行编码,如果不编码得到的数据是未编码的数据,编码使用的编码我不知道,但我第一次获取时使用utf-8来进行获取的。></result></action></package></span>

8.关于struts的文件上传:

需要在action中配置三个属性:

//头像文件private File headImg;private String headImgContentType;private String headImgFileName; headImg是前台file中的属性名<input type="file" name="headImg"/>

在后台一般可以这样处理:

<span style="font-size:18px;"><span style="white-space:pre"></span>if (user != null) {//处理头像上传if (headImg != null) {//设置文件路径String filePath = ServletActionContext.getServletContext().getRealPath("upload/user");//设置文件名:UUID+原文件名末尾的格式。String fileName = UUID.randomUUID().toString().replaceAll("-", "")+ headImgFileName.substring(headImgFileName.lastIndexOf("."));</span></span>
<span style="font-size:18px;"><span style="white-space:pre"></span>对文件名进行uuid编码,避免一些用户直接访问到上传的文件</span>//复制文件FileUtils.copyFile(headImg, new File(filePath, fileName));user.setHeadImg("user/"+fileName);}userService.saveUserAndRole(user,userRoleIds);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;"></span></span>
<span style="font-size:18px;">9.Hibernate自带分页查询:</span>
<span style="font-size:18px;">Query query = session.createQuery("From User");</span>
<span style="font-size:18px;"></span>query.setFirstResult(0);//设置起始行.</span>
<span style="font-size:18px;"></span>query.setMaxResult();//设置每页大小,即从起始行开始获取多少条数据。</span>
<span style="font-size:18px;"></span>query.list();</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">10.spring的依赖注入是通过set方法注入的,是在对象创建后注入的.</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">11.使用注解也可以通过set方法进行注入:</span></span>
<span style="font-size:18px;">private UserDao userDao;@Resource public void setUserDao(UserDao userDao) {super.setBaseDao(userDao);this.userDao = userDao;}</span></span>
<span style="font-size:18px;">12.hibernate的fetch属性在many-to-one时进行设置,有两个设置值:join和select。</span>
<span style="font-size:18px;">这个属性决定了在查询是先查询主表再查询关联表还是要把主表和关联表一起查询出来。</span>
<span style="font-size:18px;">select方式是先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询,如果lazy=true(延迟加载),select在查询时只会查出主表记录,用到了关联数据时再自动在执行查询.</span>
<span style="font-size:18px;">  而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询</span>
<span style="font-size:18px;">13.hibernate中session一级缓存的作用域:创建session到关闭session一级缓存的作用域都有效,但当提交事务后就不能影响到事务了</span>
<span style="font-size:18px;">14.mysql数据库中的datetime对应java中的Timestamp的类型</span>
<span style="font-size:18px;">15.使用struts2框架时,前台页面表单提交的数据为大文本时 可以使用<s:textarea name="" rows="指定由几行" cols="指定有多少列"  /></span>
<span style="font-size:18px;">16.使用于ajax技术,将表单中所有的表单项数据整理成json格式:</span>
<span style="font-size:18px;">$("#form").serializa();//将这个表单所有输入项转成json的格式$("#form")用于指定是哪个表单。示例:$.ajax({url:"${basePath}sys/home_complainAdd.action",data:$("#form").serialize(),type:"post",async: false,success: function(msg){if("success" == msg){//2、提示用户投诉成功alert("投诉成功!");    //3、刷新父窗口window.opener.parent.location.reload(true);    //4、关闭当前窗口    window.close();} else {alert("投诉失败!");}},error: function(){alert("投诉失败!");}});</span>
<span style="font-size:24px;">17.js中关闭当前窗口:window.opener=null;window.open('','_self');window.close();//没有提示直接关闭当前窗口</span></span>
<span style="font-size:24px;">18.刷新父窗口:window.opener.parent.location.reload(true);</span></span>
<span style="font-size:24px;">19.powerdesigner书写的一对一的对应关系是双向保存外键约束;逆向工程生成的实体类都会包含集合来保存关联的对象。</span></span>
<span style="font-size:24px;">20.各种数据类型转化为json格式:</span></span>
<span style="font-size:24px;"></span>bean转化为json格式:{'属性':value,'属性':value....}</span></span>
<span style="font-size:24px;"></span>List转化为json格式:[{},{},{}]</span></span>
<span style="font-size:24px;"></span>map转化为json格式:{key:value,key:value.......}</span></span>
<span style="font-size:24px;"></pre><pre name="code" class="javascript"><span style="font-size:24px;">21.在ajax中接收到json格式的数据时,可以通过数据.属性值来访问对应的属性,还有另外一种方法来获取:</span></span>
<span style="font-size:24px;"></span>对于ajax的回调函数success:function(data,textstatus,ajax ){</span></span>
<span style="font-size:24px;"></span>//data为返回的数据对象</span></span>
<span style="font-size:24px;"></span>//textstatus是文本的状态</span></span>
<span style="font-size:24px;"></span>//ajax是返回ajax对象,通过ajax.responseText可以获取到json或者xml 文本类型的数据</span></span>
<span style="font-size:24px;"></span>}</span></span>
<span style="font-size:24px;">>22.使用web应用容器来选择对应的spring容器:</span></span>
<span style="font-size:24px;">ApplicationContext app  = WebApplicationContextUtils.getApplicationContext(request.getContext); </span></span>

这是spring框架提供的技术


25.target属性:<a> 标签的 target 属性规定在何处打开链接文档。


如果在一个 <a> 标签内包含一个 target 属性,浏览器将会载入和显示用这个标签的 href 属性命名的、名称与这个目标吻合的框架或者窗口中的文档。如果这个指定名称或 id 的框架或者窗口不存在,浏览器将打开一个新的窗口,给这个窗口一个指定的标记,然后将新的文档载入那个窗口。从此以后,超链接文档就可以指向这个新的窗口。

target的几种属性值:
_blank -- 在新窗口中打开链接 
_parent -- 在父窗体中打开链接 
_self -- 在当前窗体打开链接,此为默认值 
_top -- 在当前窗体打开链接,并替换当前的整个窗体(框架页) 
一个对应的框架页的名称 -- 在对应框架页中打开


26.Calendar类:Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法


27.本次项目中用到的工具:log4j dom4j poi powerDesigner svn Quartz fusioncharts  hibernate逆向工程 ueditor 日志组件 hiJson






                                             
0 0
原创粉丝点击