java学习日记第三阶段Word格式.docx
《java学习日记第三阶段Word格式.docx》由会员分享,可在线阅读,更多相关《java学习日记第三阶段Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
filter-name>
struts2<
/filter-name>
url-pattern>
*.action<
/url-pattern>
/filter-mapping>
(2)Src下增加了struts.xml。
查看Struts——》strutscore中的————》struts-default.xml。
所有的struts继承于struts-default.xml
(3)在web.xml文件中增加过滤器
(4)写Action类
(5)配置struts.xml
✓Struts.xml中增加了
(1)<
packagename="
项目名"
extends="
struts-default"
>
/package>
(2)<
actionname="
loginAction"
class="
包名.类名(包名.LoginAction)"
name中的首字母最好小写,它相当于后面配置的class的一个对象。
(3)页面的提交不是Servlet了而是loginAction.action
(4)LoginAction.java中写publicStringexecute()方法。
在此方法中区分get和post方法。
HttpServletRequestrequest=ServletActionContext.getRequest()
Stringresult="
"
;
//根据方法名的不同,给定不同的返回值。
把页面转向全改成result="
的返回值。
通过不同的返回值,在struts中,通过<
resultname="
loginOk"
/result>
跳转到不同的页面
if(request.getMethod().iequalsgnoreCase("
get"
)){
result="
getOk"
}
✓Struts的工作顺序:
(1)website启动时,监听器servletContextAction中的applicationstart方法解析struts.xml。
用反射技术【dom和Sax】,检查class的配置信息是否正确。
(2)系统启动后,会把struts.xml中的内容,都读入到内存中,保存成一个Map对象(name,class)
(3)用户登陆访问http:
//localhost:
8080/Bookshop/loginAction.action。
在过滤器中触发dofilter方法,url被StrutsPrepareAndExecuteFilter过滤出loginAction字符信息。
是客户端的发出请求。
所以在index.jsp中的request.dispatcher不能这样写,因为客户端的请求是经过过滤器的,必须写成response.sendRedirect(basepath+"
mainAction.action"
)
(4)用loginAction在map中通过getkey()查找,如果匹配,就可以找到后面对应的class
(5)找class中默认的execute()方法
✓Struts的result的类型.
默认是dispatcher
result-typename="
dispatcher"
Dispather是指从Action转到JSP页面
chain"
Chain是指从*.Action到*.Action
redirect"
Redirect是指从*.action重定向到*.jsp
redirectAction"
Struts2的urlpattern模式的缺陷:
与资源的路径无关
2015-10-9Struts深入
✓优化Struts:
Struts动态指定
在URL的访问地址中,以前直接指向一个具体的servlet,这样会产生很多的Servlet对于系统的维护和扩展不好,优化思路url中既包含具体的action,还可以包含action中指定的方法。
【将登录loginAction和退出logoutAction全放到UserAction中,在类中写login和logout方法】
然后使用通配符的方式:
actionname="
userAction_*"
包名.UserAction"
method="
{1}"
>
Servlet的工作特点:
单例模式(默认,Singleton)————不可以使用成员变量
Struts为了进行对象传递(ognl),没办法使用单例模式了(prototype)——可以使用单例模式
Struts的好处:
不用繁琐的使用request.getparameter()获取值了,提高了效率
缺陷:
不能使用单例模式了,性能有损失。
类名是名词开头,方法名是动词开头。
BookAddAddBook
Struts中对象传递的问题:
OGNL
(1)建立成员变量Bookbook
(2)在JSP页面传递的时候,不再通过name=“isbn”传递,然后再Action中getparameter接收,而是通过name="
book.ISBN"
进行传递
book是Action中的成员变量,ISBN是book的属性
Struts中用于文件上传的控件是:
commons-fileupload.jar和commons-io.jar——不再使用smartupload控件
帮助地址:
commons.apache.org
将图片存放在文件夹下而不是存放在数据库中的好处:
浏览器有缓存。
Struts中图片文件的上传:
(1)byte[]bytes=FileUtils.readFileToByteArray()
解决Struts中的乱码问题:
在Struts中配置拦截器<
constant>
/constant>
Struts代替Servlet的优势:
配置文件中的配置信息少了,便于后期的维护,不利于调试
Struts中获取request、获取session、获取application
ServletActionContext.getRequest()
request.getSession();
request.getSession.getServletContex();
获取request的方式:
不解耦的方式:
ServletActionContext
与ServletAPI解耦的方式:
ActionContext的get方法,get("
request"
继承ActionSupport进行数据验证,不提倡。
因为每次验证还需要发到服务器端进行验证,客户端脚本验证即可。
拦截器与过滤器的区别
拦截器只拦截的是Action,过滤器过滤所有的URL
通过Struts.xml文件中配置拦截器,需要继承ActionSurpport
2015-10-10Hibernate
✓Hibernate属于SSH中的H,定位是持久层:
(为什么是持久层:
放在数据库中了,持久不变了)
✓ORM:
Objectrelationmapping——对象关系映射。
它是实体对象(entity)与数据库中table的关系。
Mapping的目的:
利于开发,将无规律的东西,形成规律性的,形成有序的开发。
✓Hibernate是ORM开发模型中最重要、历史最悠久的框架
✓所谓的对应关系——从软件工程来看:
开发的过程是:
(1)需求分析阶段:
概念模型(CDM)————围绕的哪些概念?
(domain(域)+domain直接的关系)
(2)设计阶段:
逻辑设计:
实体类:
entityclass(dto/POJO/VO)
【由domain域转换而来】
物理设计:
(数据库设计)——Table
✓Hibernate/EJB是J2EE项目,变的庞大而复杂。
我们用Hibernate3.2/3.3Hibernate4
✓持久层开发:
HibernateVSJDBC
以前JDBC读数据的时候,将对象的属性一个个读(rs.getString("
id"
)),代码冗余,开发效率低。
所以Hibernate对JDBC进行了非常轻量级的对象封装。
简化了JDBC繁琐的代码
✓Hiberanate操作的优势:
1.操作代码简化了(对比JDBC中的ResultSet)
List<
User>
users=query.list();
Queryquery=session.createQuery("
fromUser"
)User是实体。
是用的HQL语句。
[session当成是connection]
【数据库不认识HQL语句,那么Hibernate框架自己来帮你转】
2、Hibernate的使用是HQL查询,不是sql查询。
当出现数据迁移的时候(oracle——》mysql)不需要修改代码。
因为查询的是实体。
对开发的要求:
不要使用数据库专有的信息,如oracle的sequence。
但是在提高网站的性能时:
需要使用专有的信息(如sequence,存储过程),所以
对于性能要求高的系统(如高并发的网站),为提高性能,尽量选用数据库的专有信息,所以这会与Hibernate使用原则冲突,所以高性能系统,尽量不要选用hibernate。
【像从entity转table时也很浪费性能】
Hibernata.cfg.xml:
!
DocTYPE>
:
Xml中用于描述文档结构的
session-factory>
/session-factory>
HibernateSessionFactory.java类:
里面全是static类,是包装的单例。
(1)privatestaticStringCONFIG_FILE_LOCATION="
/hibernate.cfg.xml"
(2)privatestaticfinalThreadLocal<
Session>
threadLocal=newThreadLocal<
();
TreadLocal():
线程局部变量。
为了线程独立,在高并发的环境中,把自己的session放在里面,每个session互不影响。
privatestaticorg.hibernate.SessionFactorysessionFactory;
privatestaticStringconfigFile=CONFIG_FILE_LOCATION;
static{
try{
configuration.configure(configFile);
sessionFactory=configuration.buildSessionFactory();
}
}
Session工厂是单例,静态代码块最先执行,且只执行一次
publicstaticSessiongetSession()throwsHibernateException{
Sessionsession=(Session)threadLocal.get();
在多并发的环境下,取属于你那个线程的session对象
Hibernatereverseengineering:
Hibernate的逆向工程
正向工程:
domain——》table
逆向工程:
table——》entity
.hbm.xml:
用于描述表和实体之间的影射关系
在影射的设置的时候,ID策略选择assign模式,即自己设置主键的增长。
例如:
selectnvl(max(id),0)因为hibernate是对很多的数据库兼容。
*.hbm.xml文件中:
注意schema=“TT”是用户
hibernate-mapping>
classname="
com.iscc.tt.entity.Tclass"
table="
TCLASS"
schema="
TT"
idname="
cno"
type="
java.lang.String"
<
columnname="
CNO"
length="
30"
/>
generatorclass="
assigned"
/id>
setname="
tstudents"
inverse="
true"
key>
/key>
one-to-manyclass="
com.iscc.tt.entity.Tstudent"
/set>
/class>
/hibernate-mapping>
Hibernate数据库映射的要求:
1、ID策略:
选择assign模式,即自己设置主键的增长
2、每个表必须要有主键
3、整型一定要使用number,浮点使用number(5,2)
Hibernate的编程思想:
(1)sessionperrequest(推荐)
(2)Sessionperoperation(传统模式,不好,数据库的连接没法重复使用)
JDBC默认模式:
connection.autoCommit默认为true
Hibernate默认模式connection.autoCommit为假。
所以在hibernate.cfg.xml修改配置信息,添加属性:
show_sql=true【这个是在console平台吧hql语句转换为结果(sql)】
修改为自动提交模式:
propertyname="
connection.autocommit"
true<
/property>
✓HiBernate中session的get和load的区别:
(1)get(Classclazz,Serializableid):
没有懒加载。
和缓存有关。
直接从数据库中找。
如果没有找到指定的对象,则返回为null,没有异常。
(2)Load(Classclazz,Serializableid):
hibernate的懒加载特点在此处表现。
假定对象存在(缓冲中存在或数据库中存在)
【hibernate的机制是先在缓存中找,没有的话去数据库中找,抛出SQL,找到了再加到缓存中】
它采用懒加载机制获取对象,如果对象不存在,在读取对象的属性信息时会出错。
load方法返回的是代理类。
在真正调用的时候再向数据库发出SQL语句。
Returnthepersistentinstanceofthegivenentityclasswiththegivenidentifier,assumingthattheinstanceexists.
org.hibernate.LazyInitializationException:
couldnotinitializeproxy-noSession
org.hibernate.ObjectNotFoundException:
Norowwiththegivenidentifierexists:
[com.icss.tt.entity.Tclass#java-1111]
//获取connection
Sessionsession=HibernateSessionFactory.getSession();
session.flush();
//对缓存进行刷新
✓SessionFactory对session进行包装,session对connection进行包装。
一个session相当于一个connection
✓为了配合懒加载机制,不能再dao层关闭session。
在UI层HttpSessionFactory.closeSession().因为在UI层需要用到对象的属性信息。
配合的是sessionperrequest模式。
【HttpSessionFactory会通过TreadLocal()找相应的request】
✓HQL:
hibernatequerylanguange
特点:
1.非数据库查询,而是entity对象查询
2.尽量不要写要查询的字段,而是读取所有字段。
如:
FROMTclass
3.hql是需要区别大小写的
✓HQL中查询某个字段通过iterate()方法
✓Query的List()与iterate()方法的区别:
(1)q.list()每次都向数据库发出查询的请求,和缓存无关。
(2)q.ierate():
●第一次只查询主键字段。
“fromTClass”[it.next()返回的是代理类]。
●取值的时候再分别查询。
Hibernate:
selecttclass0_.CNOascol_0_0_fromTT.TCLASStclass0_
✓到底什么是懒加载?
懒加载又称延迟加载,找到数据但是不是立刻加载到内存,只是返回一个代理类,而是真正使用的使用给你加载。
get()方法是立即加载,load()方法是延迟加载。
当session关闭后,延迟加载失败
懒加载在哪里用的最明显?
在查询学生的时候,学生的成绩都在代理类中,但是我真正需要的只是学生的成绩,我只调用学生的成绩。
延迟加载就是懒加载,使用懒加载是解决了负载问题,也就是说懒加载后不会立即去访问数据库,而是尽量延迟,延迟到用户执行数据库查询命令的时候或者使用initialize方法的时候去和数据库交互,这样就减轻了与数据库交互的压力,如果缓存中有数据的话会优先考虑缓存数据,总之是尽量避免和数据库的直接交互,但有些时候也会出现数据没有得到及时更新的错误数据,所以,在金融等方面的项目开发的时候尽量避免懒加载。
比如在统计论坛数据访问量等要求不是很严格的情况并且数据量比较大的情况下可以使用懒加载。
2015-10-12Hibernate对多表进行操作
1、事务:
2、在dao层建立多对一的关系。
ManyToOne的关系。
多对一的关系会简单一些,由子去找父
学生类中有一个班级的引用。
【privateTclasstclass】
TStudent.hbm.xml文件中有:
many-to-onena>
✓Hibernate的核心特点:
数据迁移和简化代码。
Hibernate对JDBC进行包装而已。
✓JDBC的速度要快。
Hibernate是对象查询。
Hibernate的缺点:
速度慢,影响性能,一取取太多,第二是取session(connection)的时候,太慢。
懒加载:
代码简化了,但是速度慢了。
✓总结:
Hibernate与JDBC的区别:
(1)Hibernate是对JDBC进行封装,有利于数据迁移和简化代码。
数据迁移:
因为是对对象进行查询。
简化代码:
数据库的连接,数据的增删改查的代码都简化了。
(2)Hibernate是进行对象查询
Hibernate多表查询:
使用SQLQuery进行写入,解决主键自增长的问题
内存中的数据写到文件中去的时候,一是网络传输,一是写到文本本件中。
一个网站像另外一个网站访问的时候,要返回一个集合,集合中都是对象,对象必须用序列化标识,才能够获取
序列化的使用场景:
分布式()
所以你会发现,在hibernate中是对对象进行操作,所以它实现了序列化接口,用于写入数据库中。
Hibernate的数据库关闭使用的是sessionperrequest模式,是在request结束的时候关闭。
与sessionperoperation。
SQLQuery不能使用iterate()
2015-10-14Spring
111.27.47.183里面的spring核心功能指南
Spring的首创人:
RodJohnson
SpringPPT
Java比微软强在哪里?
Java是容器和组件模型。
微软的是全部放在IS上
Tomcat:
是web容器,(Servletcontainer)主要用于Servlet的管理,Servlet生命期。
做SocketServer。
先建立监听,创建socket……
Tomcat服务器:
(1)Servlet的管理
(2)HttpServer接收请求。
Tomcat中有apache
JBoss:
HTTP协议的特点:
无状态,基于TCP/IP协议。
TCP/IP是建立socket通道。
负载均衡