首页 > 代码库 > J2EE学习笔记

J2EE学习笔记

中国人民银行企业培训-J2EE

1.HTTP超文本传输协议,应用层协议。 HTTP是基于请求、响应模式的,无状态的协议。

2.HTTP1.0通信过程:客户端发起连接->客户发送请求->服务器响应请求->服务器关闭连接;需要不断建立连接,开销大。

3.HTTP1.1通信过程(默认使用持续连接):客户端发起连接->客户发送请求->服务器响应请求->客户端继续发送请求->服务端响应->服务器关闭连接;

4.HTTP组成:请求行、消息包头、请求正文。

请求行:Method Request-URI|HTTP-Version CRLF(回车)

例如:GET /test.html HTTP/1.1 CRLF

Method包括GET/POST/HEAD等。其中HEAD只返回响应消息包头。

5.Tomcat中通过如下语句配置项目:

<Context path=”/test” docBase=”D:\test\WebRoot” reloadable=true””/>

6.Servlet编程:写类继承自HttpServlet->重写doGetdoPost->web.xml中注册Servlet->编写处理函数:

resp.setContentType(“text/html”);PrintWriter out=resp.getWriter();

out.println(“<HTML>代码”);

7.JSP编程:在JSP中使用<%%>包含Java代码。

8.表单提交GET/POST区别。

A.处理方式不一样。GET添加参数在地址栏,POST添加参数在HTTP请求体中。

B.处理方法不同。doGetdoPost

9.JSP执行过程:请求某JSP->转换成Servlet->返回响应。

10.JSP中声明变量为<%! int a=0;%>与不加!的区别:声明的变量为成员变量。不适用!声明的是局部变量。

11.JSP重点内置对象:requestresponsesessionapplication

12.JSP中的事务处理一般有JAVA BEAN完成。<jsp:useBean>

13.Java Bean要求:公共的public类,含有无参构造和gettersetterJava Bean范围:pagerequestsessionapplication

14.Servlet生命周期:

A.初始化:init。三种情况装载Servlet:①Servlet容器自动装载某些ServletServlet容器启动后,客户首次向Servlet发出请求③Servlet类文件更新后,重新装载ServletServlet装载后,创建Servlet示例并调用init方法初始化。整个Servlet周期中中,init只调用一次。

B.请求响应阶段:serviceService方法通过servletrequest获取客户端请求信息、处理该请求并返回响应结果servletresponse

C.终止阶段:destroyWeb应用终止或servlet容器停止工作时,释放占用的资源。

15.通常自定义servlet直接集成HttpServlet即可,这样便不用事先service方法。Service参数为ServletRequestServletResponse

16.Servlet对象创建时机:①Web客户第一次请求servlet②设置<servlet>元素的<load-on-startup>,启动Web应用时会按照指定顺序创建servlet

17.Servlet容器启动Web应用时,为每个Web应用创建一个ServletContext对象。ServletContext可以存放共享数据:主要方法:setAttributegetAttribute

18.Servlet是单例的,只有一个对象。而且Servlet是多线程执行的。因此,编写时注意多线程问题。因此,servlet中尽量不要定义成员变量,定义成员变量容易出现多线程问题。可以通过定义局部变量解决(局部变量属于单个线程、统一对象成员变量可被多个线程访问)。解决多线程同步问题方法:

A.实现javax.servlet.SingleThreadMode。这样servlet单线程运行。

B.去除成员变量,全是用局部变量

C.是用同步代码块:synchronized{...}

19.Cookie的使用(Cookie从服务器发出,存在于客户端硬盘上):

Cookie ck = new Cookie(“key”,”value”);response.addCookie(ck);

Cookie c = request.getCookies();

20.在servlet中使用如下语句请求转发:(还是当前页面,setAttribute的数据能够在test.jsp中取得)

request.getRequestDispatcher(“/test.jsp”).forward(request,response);

使用如下语句重定向:(转到新页面,setAttibute数据在test.jsp中不能取得,客户端需要发送两次请求)

Response.sendRedirect(“test.jsp”);

21.Web跟踪客户端状态方法:

A.建立具有跟踪数据的隐藏字段

B.重写包含额外参数的URL

C.使用持续的Cookie

D.使用Servlet API中的SessionSession位于servlet容器,cookie位于client硬盘上,会话cookie位于浏览器进程中。

22.HttpSession接口:getIdinvalidate()使当前session失效、setAttributegetAttributeisNewsetMaxInactiveInterval设定session处于不活动状态的最大间隔。

23.Listener监听器用于发生一定动作时触发操作。例如,HttpSessionListener监听HttpSession的操作。创建Session时,激发sessionCreated方法;销毁Session时,激发sessionDestroy方法。HttpSessionAttributeListener监听HttpSession属性操作。Session增加属性,激发attributeAdded方法;Session删除属性时,激发attributeRemoved方法;Session属性被重新设置时,激发attributeReplaced方法。Servlet也有相应的监听器。

24.Filter过滤器对servlet容器的请求和响应对象进行检查和过滤。Filter而已过滤的对象可以是ServletJsp或者HTMLFilter类方法:init(初始化,读取web.xml中过滤器的初始化参数)->doFilter(执行过滤操作)->destroy(释放过滤器资源)

25.EL表达式语言,用于减少JSP中的脚本:${expr}EL默认对象:pageContextpage/request/session/application/Scopeparam(请求参数)paramValuesheaderheaderValuescookie

26.客户化JSP标签,使用tag标签,减少JSP中代码量。创建标签步骤:①创建标签处理类②创建爱你标签库描述文件③在web.xml文件中声明(servlet2.4以后不需要)④在JSP中引入标签库。

27.Struts2.1是基于请求响应模式的应用框架。主要包括:控制器、业务逻辑层和数据逻辑层。工作过程:客户请求->过滤器->拦截器Interceptors->Action->JSP。 

28.Struts2使用过程:新建Web项目->加入structs2.0支持(commons-fileupload/commons-logging/ognl/struts2-core/xwork/freemarker.jar)->编写处理类Action->编写配置文件(src目录下structs.xml,在WEB-INFO/class中自动复制出一份)->web.xml中配置structFilter。工作过程:请求->web.xml过滤器到structs->structs.xml->请求action->处理类action->返回标志->跳转

29.在Action中,成员变量名跟表单名字相同并生成gettersetter方法,struct完成表单变量传递。

30.Structs类型转换:对于常见类型,structs2从客户端获取后,尝试性的自动转换成Action中定义的类型。如果转换不成功,抛出异常,输出字符串。对于自定义类型,例如输入坐标,我们需要进行类型转换。定义Point类,然后在PointAction中加入Point成员变量,生成gettersetter,然后写配置文件:PointAction-conversion.properties(待处理类包中,里面设置待处理类和处理类(继承自DefaultTypeConverter)),最后在处理类中实现类型转换。处理类也可继承自StrutsTypeConverter,完成批量转换从待处理类和String的相互转换。对于多个坐标,处理Action中可使用list<Point>成员变量,完成批量转换。

31.上面为局部转换,针对的是每个action。全局转换可针对全部action,属性文件(src文件下,不带包)为:xwork-conversion.properties

32.Structs定义的状态变量:SUCCESS/ERROR/INPUT/LOGIN/NONE.

33.Struts输入校验(服务端验证),分为编码方式校验和校验框架两部分。如果输入信息不正确,返回INPUT

A.编码方式:Action中重写validate方法。Validate优先于executeaddActionError添加错误信息,JSP中使用<s:actionerror/>显示错误。Structs会自动生成field级别的校验消息,使用<s:fielderror/>显示。Action中新建RegisterAction.properties实现国际化。使用structs标签自带错误输出功能。

B.校验框架方式:action包下定义配置文件:(Action-validation.xml)RegisterAction-validation.xml。校验框架分为属性优先(field)或者校验器优先(validator)首先执行类型转换,然后是对应的校验框架,然后是特定方法的validate(例如formmethod属性设置为test方法,action中方法为validateTest()),然后是validate方法。如果上述过程中出现错误,都不会执行execute方法,转而页面装转向struts.xmlinput对应的页面。

34.国际化。命名方式:文件名_国家代码_properties,位于src文件夹下。

35.拦截器Interceptor:类似于过滤器。Interceptorstructs2的核心。需要实现方法:initintercept(在请求前或处理后处理)destroy方法。定义拦截器类需要实现Interceptor接口->structs.xml中进行配置(interceptors)->structs.xmlaction引用拦截器。注意:使用自定义拦截器后,默认拦截器不再起作用。需要加上默认的拦截器,且自定义拦截器位于默认拦截器之上。使用拦截器<param>可以传值。Interceptor接口要求必须实现initinterceptdestroy方法,可以使用AbstractInterceptor。拦截器、过滤器执行过程:interceptor1.invoke->interceptor2.invoke->validate->interceptor2返回并结束->interceptor1返回并结束。

36.Struts2提供支持文件上传<s:form action=”upload” enctype=”multipart/form-data”>Uploadaction继承ActionSupportStruts默认是执行请求转发,刷新一次就执行一次,可以改为重定向:<result type=”redirect”>

37.JAVA访问数据库方式:

A.JDBC-ODBC桥加ODBC驱动程序。ODBC驱动提供JDBC访问。

B.本地API:部分用Java编写的驱动程序。

C.JDBC网络纯Java驱动。将驱动转换为与DBMS无关的网络协议。

D.本地协议纯Java驱动程序。与DBMS有关的网络协议。

数据库连接的一般过程:

载入JDBC驱动程序->定义连接URL->建立连接->创建Statement_>执行查询或者更新->结果处理->关闭连接。

Class.forname(“oracle.jdbc.driver.OracleDriver”);//载入驱动

DriverManagergetConnection用于建立连接

Connection类的close方法用于关闭数据库连接

ConnectioncreateStatement发送SQL语句。使用Statement对象{statementpreparestatementCallableStatement},常用方法executeQueryexecuteUpdateclosePreparestatement可以用?预留参数;callablestatement提供存储过程支持。

38.应用程序的分层:四层{表述层structs、业务逻辑层、持久化层Hibernate、数据库层}spring可以管理前三层。

39.数据库知识:

A.主键。代理主键机制,代理主键不代表业务,不会被改变。

B.表与表之间的参照完整性连接表表示多对多,一对多用外键。

40.ORM模式:对象-关系映射。在单个组件中负责所有实体域对象的映射。类与表对应,示例与表中记录对应。MVC模式;DAO模式:Data Access Object

41.使用Hibernate步骤:创建Hibernate配置文件->创建持久化类->创建对象-关系映射文件->通过HibernateAPI编写数据库访问代码

42.MyEclipse添加Hibernate功能时,需要更改默认选项,添加jar文件到WEB-INF/lib下。hibernate.cfg.xml配置:

<session-factory>

<property name=”connection.url”>jdbc:mysql://localhost:3306/hibernate />

<property name=”connection.username”>root />

<property name=”connection.password”>root />

<property name=”connection.driver_class”>com.mysql.jdbc.Driver />

<property name=”connection.dialect”>org.hibernate.dialect.MySQLDialect />

</session-factory>

数据库建表person->针对这张表新建持久化类com.hibernate.model.Person{1.需要gettersetter.2.需要id属性,称之为OID(对象标示符).3.提供默认构造}->编写映射文件Person.hbm.xml,放到src下而不是包下:(hib内置的编辑器打开)

<class name=”com.hibernate.model.Person” table=”person”>

<id name=”id”column=”id” type=”int”>

    <generator class=”increment”/>//主键id的生成方式

</id>

<property name=”username” column=”username” type=”string”

...

</class>

在主配置文件hibernate.cfg.xml中配置:<mapping resource=”Person.hbm.xml”/>

43.Hibernate提供的SQL操作类:

A.Configuration:配置数据库。

B.SessionFactory:创建session一个SessionFactory对应于一个数据库存储源,它是线程安全的(可被多个线程访问),重量级的。可以理解为一个SessionFactory对应于一个数据库。

C.Session:相当于以此数据库操作过程。Session不是线程安全的,轻量级的。可理解为一次数据库sql执行过程。此session非彼session!常用方法:savaupdatedeleteget

D.Transation:事务处理。

44.可编写HibernateUtil类完成对session的操作(静态SessionFactory、静态代码块处理sessionFactory)。

45.编写DBPerson处理数据库和Person对象。Hql针对的是类对象而言(select * form PersonPerson是类不是表 ),sql针对的是数据库。

46.数据库中的blob类型用于存二进制文件,Hibernatexml中用binary转换,持久化类用byte[]转换。 

47.1对多关系双向关联关系(就2个),多的通过外键参照1的那一方。使用key元素设置外键。Cascade的理解:1的那份保存,然后按照外键全部保存多的。

48.1对多双向自身关联关系(树形结构,子类11父类,子类1n孙类),例如Category{private Long id;private String name;private Category parentCategory;//父 private Set childCategories;//子类别}。数据库表中使用有三个字段:idnameparentID(外键,指向本身的ID)