j2EE课程总结(Java课程学习总结)
摘要: j2EE课程上完之后的总结java是变成语言,运行环境,开发平台硬件-》操作系统-》虚拟机-》字节码程序java-》字节码-》类加载器-》字节码校验器-》解释器、优化器、JIT-》硬件静态变量为类所有,静态方法也只能访问静态变量继承:单一继承特点:具有层次结构,继承父类的属性方法优点:代码可重用性,父类属性和方法可用于子类,设计应用程序更加简
摘要:Java课程学习总结
java
是编程语言,运行环境,开发平台
硬件-》操作系统-》虚拟机-》字节码程序
java-》字节码-》类加载器-》字节码校验器-》解释器、优化器、JIT-》硬件
静态变量为类所有,静态方法也只能访问静态变量
继承:
单一继承
特点:具有层次结构,继承父类的属性方法
优点:代码可重用性,父类属性和方法可用于子类,设计应用程序更加简单,轻松自定义子类
先调用父类构造函数(super(参数列表)),再调用子类构造函数
多态:使用不同的实例而执行不同的操作,包括方法重写 (相同名称相同类型)和方法重载
访问修饰符:public该类和非该类均可访问;private:只有该类可以访问;protected:该类和子类成员可以访问,同一个包中的类可以访问;默认:相同数据包中的类可以访问
方法修饰符:static,final,abstract;static静态方法,可以调用其他静态方法,必须访问静阿提数据,不能使用super或this关键字
final:不能修改的变量,子类不能重写方法
abstract:抽象方法,必须声明在抽象类中 abstract class{ abstract type method_name(paramter_list); }
接口:接口中的方法只能被声明不能是具体的实现。一个类可以实现多个接口,可以实现多态
容器类:
Array随机访问高效率,容量无法修改,元素的类型识别,可持有primitives
vector具有类似数组的数据结构,而且是动态的,可以存放一定数量的元素,容量可以递增
collection框架:将多个元素组成一个单元的对象,用于存储检索和操纵数据
ArrayList对象是长度可变的对象引用数组,继承AbstractList并实现List接口
LinkedList创建链表数据结构,继承AbstractSequentialList并实现List接口
HashMap实现了Map接口,用来存储键值映射关系
Iterator for(Iterator it=c.iterator;it.hasNext();){}
web应用程序:表示层,业务层,数据层
http协议:请求信息:方法、请求资源名称、请求资源类型、浏览器信息、版本
响应信息:资源名称、服务器信息、状态码、资源类型、资源大小、说明、修改日期
servlet:基于java的web组件,用来扩展以请求/响应为模型的服务器的能力提供动态内容
servlet容器:web服务器的一部分,管理和维护整个servlet的生命周期,支持http协议负责处理客户请求、把请求转发给适当的servlet并把结果返回给客户
servlet优势:servlet是标准的java程序,可以访问大量java api;servlet具有平台无关性;servelt使用标准api,被更多的服务器支持;servlet速度比cgi速度更快
servlet工作原理:客户端向服务器发出请求,服务器创建线程,对线程进行处理,与数据库进行交互,最后生成响应给客户端,每个请求由一个轻量级的java线程进行处理,不用为每一个请求启动一个系统线程,一个servlet在请求期间会驻留在内存中。,响应所有的并发只需要一个实例。
servlet编程接口:
在实现servlet时必须实现它的五个方法
public void init(ServletConfig config)throws ServletException容器实例化后就调用此方法,从ServletConfig对象中读取与容器相关的配置数据并保存起来供以后使用。对任何servlet实例此方法只能被调用一次
public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException 成功初始化后此方法用来被处理用户请求
public void destory()容器可以在任何时候终止servlet服务,容器在调用此方法前必须给service()线程足够时间来结束执行,service正在执行时destory不能被执行
public ServletConfig getServletConfig()servlet 初始化时容器传递进来一个ServletConfig对象并保存在Servlet实例中
public string getServletInfo(){}返回一个string对象,包括创建者信息,日期,描述信息等。
HTTPservlet类:service()方法作为http请求的分发器,任何时候都不能被重载,当请求到来时service方法决定请求的类型get,post,head,options,delete,put,trace并把请求分发给响应的处理方法
doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace()为了响应特定的http请求必须重载形影的do方法。
servlet执行过程:加载和实例化(实例化该类的一个实例)、初始化(传递唯一一个ServletConfig对象完成这个过程,目的是读取永久配置信息,昂贵资源及仅需执行一次的任务)、处理请求(HttpServletRequest和HttpServletResponse)、服务结束
servlet部署:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.test.login</servlet-class>
<init-param>
<param-name>visitno</param-name>
<param-value>50</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/userlogin</url-pattern>
</servlet-mapping>
servlet context
java.servlet.ServletContext接口定义了一系列的方法用于与相应的servlet容器通信,每个jvm中的每一个web-app只能有一个ServletContext,servlet实例中的getServletContext方法用来得到该servlet运行其中的这个环境对象。获取初始化参数ServletContext.getInitParameter(String name);把对象通过名称绑定到环境中,context.setAttribute(String name, Object object); 其他servlet通过context.getAttribute(String name)得到一个环境中的对象,通过context.removeAttribute(String name)在环境中移除一个对象;访问资源getResoucePaths() and getResource()可访问资源,getResourcePaths(java.lang.String path )返回一个存储web-app所以资源路径的集合
会话:服务器支持http协议,无状态,采用散列表结构保存,服务器端维护
工作方式:收到一个请求,检测请求中是否包含session_id,如果是的话检索session_id获取会话对象然后发送携带session_id的响应
会话追踪机制:cookies,SSL Sessions,URL重写,表单隐藏
cookie:引擎把用户会话保存在cookie中,发送cookie到客户端,客户端以后在每次请求中把cookie返回给服务器
jsp与javabean
jsp-》转译(从jsp元素中提取数据)-》编译(为jsp生成一个servlet)-》servlet
jsp优点:内容与表示分离;强调可重用组件;
注释的两种风格:<!– –>在源代码中可以查看到 <%– –>隐藏注释
声明:<%! int a,b,c; %>
表达式:<%=表达式%>在页面上输出信息或进行赋值操作
page指令:<%@page language=”java” import=”java.util.*,java.lang.*” autoFlush=”true” errorPage=”error.jsp” %> 不能包含动态的文件名
taglib: <%@taglib prefix=”" uri=”" %> 用于引入定制标签库
<jsp:forward>标签<jsp:forward page=”forwadTo.jsp”><jsp:param name=”username” value=”wangweiwei” /></jsp:forward> 其中page和value的值可以是表达式
<jsp:include>标签<jsp:include page=”header.jsp” flush=”true” ><jsp:param name=”username” value=”wangweiwei”/></jsp:include> 其中page和value的值可以是表达 , 在包含的页面运用request.getParameter(“username”)取得原始页面的jspparam中定义的值
<jsp:useBean>标签,创建一个bean的实例并指明它的名字和范围 <jsp:useBean id=”beanInstanceName” scope=”page|request|session|application” class=”package.class”/>
page:包含此标签的jsp页面和此文件中的所有静态包含文件,直到页面执行完毕向客户端发出响应或跳转到另外一个文件为止
request:执行相同请求的jsp文件中使用这个bean,能够使用request对象访问这个bean
session:使用相同session的jsp文件中使用这个bean
application:存在整个application生命周期内
<jsp:getProperty>标签,<jsp:getproperty name=”beanInstanceName” property=”propertyName” /> name是bean的名字,由<jsp:usebean>中的id指定;property是所指定的bean的属性名。
<jsp:setProperty>标签<jsp:setproperty name=”beanInstanceName” property=”propertyName” value=“” />
内置对象:request,session,application,构建的基础是http协议,由特定的java类生成,在服务器运行中自动生成
request.setParameter(“name”,value);
request.getParameter(“name”);
session.putValue(“name”,value);
session.getValue(“name”);
application.setAttribute(“name”,value);
application.getAttribute(“name”);
jsp汉字问题的原理:客户端与服务端用gb2312,http传输编码用ISO8859_1.
jsp<%@ page contentType=”text/html;charset=gb2312″%>
server:name=new string(name.getBytes(“ISO8859_1″),”gb2312″);
Fileter,在request到达servlet之前处理request,在离开servlet时处理response,可以解决编码和控制权限
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){
try{
request.setCharacterEncoding(“GBK”);
response.setContentType(“text/html,charset=gb2312″);
response.setCharacterEncoding(“GBK”);
chain.doFilter(request,response);
}catech(Exception e){
e.printStackTrace();
}
}
web.xml filter setting
<filter>
<filter-name>M</filter-name>
<filter-class>util.setresponseEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>M</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JDBC
jdbc访问数据库的步骤:导入java.sql包,加载并注册驱动程序,创建一个Connection对象,创建一个Statement对象,执行语句,使用ResultSet对象,关闭ResultSet对象,关闭Statement对象,关闭连接,结束
public void test(){
try{
Class.forName(“com.mysql.jdbc.Driver”);
}catch(ClassNotFoundException e){
sysout(e);
}
try{
Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,“username”,“password”);
Statement s=conn.createStatement();
ResultSet rs=s.executeQuery(“select * from user”);
//插入操作
// int rowcount=s.executeUpdate(“insert into user()values()”);
while(rs.next()){
sysout(rs.getString(1));
sysout(rs.getInt(2));
}
rs.close();
s.close();
conn.close();
}catch(SQLException e){
}
}
public void test(){
try{
Class.forName(“com.mysql.jdbc.Driver”);
}catch(ClassNotFoundException e){
sysout(e);
}
try{
Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,“username”,“password”);
PreparedStatement pstmt=conn.prepareStatement(“update user set username=? where id=?”);
pstmt.setString(1,“wangweiwei”);
pstmt.setInt(2,10);
ResultSet rs=pstmt.executeUpdate();
}
rs.close();
pstmt.close();
conn.close();
}catch(SQLException e){
}
}
struts2
基于j2ee的mvc框架,采用servlet和jsp来实现,把servlet,jsp,自定义标签和信息资源整合到一个统一的框架中
j2ee反模式
不妥的实践和做法,避免常犯的错误,找到修复错误的方法
1不友好的出错界面:定义一个或多个错误页面,显示友好的错误信息。
2滥用代码,jsp中包含大量的脚本java代码,寻找错误比较困难,维护成本大,不利于重用,新成员的学习成本高:bean化,引入委托控制器,引入业务流警察
3嵌入跳转控制:链接无效,jsp页面硬编码导航信息,引入逻辑控制,修改时设计页面数量多,工作量大,常常出现未找到页面的错误,很难修改应用流程;引入业务流警察
4复制粘贴jsp:代码需要改变时修改量大,维护困难,维护不及时会影响用户体验;引入模板
5session中数据量太大:多个数据可能对应同一个key,并发数过高时服务器性能下降,维护困难;bean化,引入委托控制器,引入业务流警察
6每个servlet包含公共部分:除了实现自己的业务外还要处理权限认证,编码格式,恶意代码检测等功能,造成了维护问题和不一致的用户体验。重构方案就是引入过滤器
7字符串用于内容生成:在doGet中和doPost中用打印语句,把大量html代码直接在servlet中打印,无法调试,维护困难,html易出现结构错误。重构方案就是使用jsp和JDom,将静态的和动态的进行分离便于维护。
8误解数据需求:大数据,不好的数据,重构方案:划分数据和工作,为将来扩展做出规划,选择适当的数据体系结构
9误解带宽需求:网络减速,低事务速率,实际发送消息比测试要大得多,并发数也比测试大很多,规划实际的网络需求,为将来扩展做出规划,选择适当的数据结构
10挖掘机:深度查询,采用会话外观或DTOFactory外观的形式,创建复杂的实体bean实例体系来支持应用,且对象层次很深。资源耗尽,性能下降,硬件花销增加,用户失去信心。重构方案是采用轻量级查询方案,值列表处理器,值对象组装器。
11辗压:失去时效的主控,时而发生的数据丢失,无法在代码层保证逻辑事务的原子性、一致性、独立性和持久性。重构方案:版本
12窒息:瓶颈,数据库性能差,用户不满意,解决方法:数据库连接池,批更新,深夜批处理更新,重构方案:打包处理
重构方案
1bean化:创建一个javabean保存jsp数据,设置要读取和写入的属性并创建爱你getter和setter方法,在jsp中使用<jsp:usebean>设置适当的会话范围
2引入业务流警察:不要把导航信息放在jsp中,维护比较困难,将网站映射放在一个中心控制点维护会容易的多;步骤a建立一个页面跳转关系图b创建一个servlet充当业务流警察c给每个页面之间的跳转起一个别名d在servlet中使用别名控制跳转e将jsp中的导航信息删除f配置servlet匹配规则
3引入委托控制器:业务流警察过多的跳转控制业务逻辑会导致该servlet很难维护,将一些跳转业务逻辑分离出去在单独的servlet中实现就会简化a建立跳转关系图b创建一个servlet充当业务流警察c给每个页面之间的跳转起个别名d将跳转规则分组,给每个组取个名字e对应每个组编写一个servlet根据别名跳转f在servlet中使用组名将控制传递给前面编写的servletf将jsp中的导航信息删除g在web.xml中配置servlet的匹配规则
4引入模板:相同页面部分力求一致
5引入错误页面:创建一个jsp作为错误的显示页面,在每个jsp页面中确保有一个错误页面的指令
6划分数据和工作:在大的项目中一个处理器或数据库负责太多的数据,可用负载均衡解决这个问题,找出超负荷的应用,确定是否可以直接扩展应用,选择合适的属性或轴据此进行划分,分析隐含的问题,查看现有的数据,提前规划。例如可以按照分厂建立相关数据,或将历史数据进行备份后导出仅仅保留最近的数据。
7使用特俗化网络:无法通过省级现有网络解决带宽问题就可以把网络划分为多部分。找出网络瓶颈,寻找协同工作的机器集群,分析安全需求,与网络管理员交流。例如web服务器设置内外两块网卡,将数据库服务器分析至内网,将应用组件\servlet\ejb以及数据库之间的数据业务流和用户与网站之间的交互业务流相分离。
8轻量级查询:应用程序有时候仅需要查询表中的一个字段,一个浅查询即可满足目的,jdbc2.x以后游标支持以及可滚动的结果集可以更轻量的查询。在用户界面中找出那些地方使用了深度查询,找出负责深度查询的逻辑,引入修改会话外观或dtofactory,引入或修改定制DTO,采用浅层数据查询,部署和测试。实例账户信息只有一个深度查询:创建一个sessionBean,创建一个定制的DTO,实现一个轻量级的查询,查询结果封装到定制的DTO中,使用DTO对象进行账户信息查询。
9版本:应用程序必须允许多个用户更新同一个数据而且必须包括用户思考时间,但要防止已做的更新不被过时的数据覆盖掉。步骤:确定哪些bean必须支持乐观枷锁策略,在实体层引入版本机制,在DTO层引入版本机制,在服务层保证版本检查,部署和测试。实例:金融系统AccountBean被并发访问版本不一致,解决方法:在数据库表Account中增加一个字段,ersion,类型为整数;AccountBean增加一个属性,version,类型为int;每次使用AccountBean读取数据时,将数据库中对应记录的version的加1,并在AccountBean对象中将version值置为加1后的version字段的值;每次写入Account表前,检查AccountBean对象中version值是否与数据库中version字段的值一致。如果一致,写入是安全的,可以更新数据库;如果不一致,说明有别的用户正在操作该数据,则提示用户不能更新。
10打包整理:数据库处理耗时耗资源,建立数据库连接池复用连接以提高性能和节约资源,执行大量sql语句耗时间和资源,可以利用批处理提高效率,减少sql语句单独传送耗费的时间。
步骤:使用数据源代替driverManager获取连接,用批处理方式处理sql语句,部署和测试
常用的包
1. java.lang.String
String类无可争议的获得冠军,应该没有人会否认这一点。这是一个最终类,用于创建/操作不可变的字符串文字。它从JDK 1.0开始就有了。
2. java.lang.System
System类的使用取决于你工作的项目类型。你可能没有在项目中使用过它,但它仍然是受欢迎的Java类之一。这是一个不能被实例化的工具类。这个类的主要用途是访问标准输入、输出、环境变量等等。它自JDK 1.0开始可用。
3. java.lang.Exception
Throwable是所有错误和异常的超类。所有异常情况的处理都属于Exception类。NullPointerException在所有的异常中是最受欢迎的。而Exception异常是在所有异常层次结构的顶部。它自JDK 1.0开始可用。
4. java.util.ArrayList
一个实现数组的数据结构的类。这个类实现了List接口,是最受欢迎的Java集合类的成员。ArrayList和Vector之间的差异是初学者常见的问题之一,它也经常在java面试中被问到。它自JDK 1.2开始引入。
5. java.util.HashMap
一个实现键值对数据结构的类。这个类实现了Map接口。类似比较ArrayList与Vector,HashMap与Hashtable也是经常拿来比较的。它也是一个受欢迎的集合类,作为一个属性-值的容器,经常用在应用程序多个层之间的数据传递。它自JDK 1.2开始引入。
6. java.lang.Object
所有Java类的根类。每一个Java类都是Object类的一个子类。经常使用在平台/框架上。它包含了一些重要方法,比如:equals, hashcode, clone, toString等等。它自从Java诞生的第一天开始可用(JDK 1.0)
7. java.lang.Thread
线程是一个单一执行的序列,多个线程可以共同存在,共享资源。我们可以扩展Thread类,并创建自己的线程。当然,使用Runnable也是另一种选择。是否使用这个类取决于你的应用程序的需要。一个普通的应用程序是完全没有必要使用线程的。它自JDK 1.0开始引入。
8. java.lang.Class
Class类是一个直接继承Object类的子类。这个类没有构造函数,它们的对象是被Java虚拟机通过类加载器加载的。我们大多数人可能没有直接使用过它,但我认为它是一个重要的做反射的类。它自JDK 1.0开始引入。
9. java.util.Date
这是用来处理日期的类。有时候,我们觉得这个类应该加入更多的实用方法。就像每个企业级应用程序都会创建一个日期的实用工具单元。它自JDK 1.0开始引入,后来在JDK1.1中发生巨大变化,弃用了一大堆的方法。
10. java.util.Iterator
这是一个接口。它很受欢迎,用来替换枚举。这是一个简单易用的单元,它用Iterable同步工作。它自JDK 1.2开始引入。
更多推荐
所有评论(0)