提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、IO流
1. 字节输入流:InputStream
字节输出流:OutputStream
字节流操作二进制文件
字符流操作字符
如读写文件
2.字符流继承于 Reader ,Writer
public static void main(String[] args) throws Exception {
/**
* 1.获取输入流 从哪里读
* 2.获取输入流 写到哪里去
*
*/
FileInputStream fis = new FileInputStream("e:/1.jpg");
FileOutputStream fot = new FileOutputStream("f:/1.jpg");
byte[] buf = new byte[1024];
while(true) {
int len = fis.read(buf);
if(len ==-1)
break;
fot.write(buf,0,len);
}
fis.close();
fot.close();
}
二、java 序列化
我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个 java 对象,例如,要将 java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做,如果要让 java 帮我们做,要被传输的对象必须实现 serializable 接口,这样, javac 编译时就会进行特殊处理,编译的类才可以被 writeObject 方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable 接口,该接口是一个 mini 接口,其中没有需要实现的方法, implements Serializable 只是为了标注该对象是可被序列化的。
三、jsp
1.九大内置对象
request
|
包含用户端请求的信息
|
response
|
包含服务器传回客户端的响应信息
|
session
|
与请求有关的会话期
|
pageContext
|
管理网页属性
|
application
|
服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
|
out
|
向客户端输出数据
|
config
|
servlet 的架构部件
|
page
|
指网页本身
|
exception
|
针对错误页面才可使用
|
2.JSP 的常用指令
(1)page 指令: 属性最多的指令(实际开发中 page 指令默认),属性最多的一个指令,根据不同的属性,指导整个页面特性格式:<%@ page 属性名 1= "属性值 1" 属性名 2= "属性值 2" ...%>常用属性如下:language:jsp 脚本中可以嵌入的语言种类,这个没用,写与不写一样的;pageEncoding:当前 jsp 文件的本身编码---内部可以包含 contentTypecontentType:response.setContentType(text/html;charset=UTF-8)import:导入 java 的包errorPage:当前页面出错后跳转到哪个页面isErrorPage:当前页面是一个处理错误的页面(2)include 指令: 页面包含(静态包含)指令,可以将一个 jsp 页面包含到另一个 jsp 页面中 格式:<%@ include file="被包含的文件地址"%>(3)taglib 指令: 在 jsp 页面中引入标签库(jstl 标签库、struts2 标签库)格式:<%@ taglib uri="标签库地址" prefix="前缀"%>
3. JSP 中动态 INCLUDE 与静态 INCLUDE 的区别
动态 INCLUDE 用 jsp:include 动作实现, <jsp:include page="included.jsp" flush="true"/>它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数静态 INCLUDE 用 include 伪码实现,不会检查所含文件的变化,适用于包含静态页面 <%@ include file="included.html" %>
三. servlet
1.什么是servlet
Servlet 是服务器端的程序,动态生成 html 页面发送到客户端,但是这样程序里会有很多 out.println(),java 与 html 语言混在一起很乱,所以后来 sun 公司推出了 JSP.其实 JSP 就是 Servlet,每次运行的时候 JSP 都首先被编译成 servlet 文件,然后再被编译成.class文件运行。有了 jsp,在 MVC 项目中 servlet 不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制 jsp 与 javabean 之间的流转
3、说一说 Servlet 的生命周期
Servlet 生命周期包括三部分:初始化:Web 容器加载 servlet,调用 init()方法处理请求:当请求到达时,运行其 service()方法。service()自动派遣运行与请求相对应的 doXXX(doGet 或者 doPost)方法。销毁:服务结束,web 容器会调用 servlet 的 distroy()方法销毁 servlet。
4、Servlet 的基本架构
public class ServletName extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ }public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}
5、什么情况下调用 doGet()和 doPost()
Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用 doPost()。
6、Request 对象的主要方法
setAttribute(String name,Object):设置名字为 name 的 request 的参数值getAttribute(String name):返回由 name 指定的属性值getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组getCharacterEncoding():返回请求中的字符编码方式getContentLength():返回请求的 Body 的长度 getHeader(String name):获得 HTTP 协议定义的文件头信息getHeaders(String name):返回指定名字的 request Header 的所有值,结果是一个枚举的实例getHeaderNames():返回所以 request Header 的名字,结果是一个枚举的实例getInputStream():返回请求的输入流,用于获得请求中的数据getMethod():获得客户端向服务器端传送数据的方法getParameter(String name):获得客户端传送给服务器端的有 name 指定的参数值getParametervalues(String name):获得有 name 指定的参数的所有值getRequestURI():获取发出请求字符串的客户端地址getRemoteAddr():获取客户端的 IP 地址getSession([Boolean create]):返回和请求相关 SessiongetServerName():获取服务器的名字
7.session 和 cookie 有什么区别
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session。3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 COOKIE。4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
四.spring
1.spring是什么
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。54主要由以下几个模块组成:Spring Core:核心类库,提供 IOC 服务;Spring Context:提供框架式的 Bean 访问方式,以及企业级功能(JNDI、定时任务等);Spring AOP:AOP 服务;Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;Spring ORM:对现有的 ORM 框架的支持;Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。
2.Spring 的 IOC 和 AOP 机制
主要用到的设计模式有工厂模式和代理模式。IOC 就是典型的工厂模式,通过 sessionfactory 去注入实例。AOP 就是典型的代理模式的体现。代理模式是常用的 java 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。spring 的 IOC 容器是 spring 的核心,spring AOP 是 spring 框架的重要组成部分。在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在spring 里创建被调用者的工作不再由调用者来完成,因此控制反转(IOC);创建被调用者实例的工作通常由 spring 容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念。面向方面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程(OOP)。OOP 将应用程序分解成各个层次的对象,而 AOP 将程序分解成多个切面。spring AOP 只实现了方法级别的连接点,在 J2EE 应用中,AOP 拦截到方法级别的操作就已经足够。在 spring 中,未来使 IoC方便地使用健壮、灵活的企业服务,需要利用 spring AOP 实现为 IoC 和企业服务之间建立联系。
AOP:面向切面编程。(Aspect-Oriented Programming)AOP 可以说是对 OOP 的补充和完善。OOP 引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP 则显得无能为力。也就是说,OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。实现 AOP 的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.简单点解释,比方说你想在你的 biz 层所有类中都加上一个打印‘你好’的功能,这时就可以用 aop 思想来做.你先写个类写个类方法,方法经实现打印‘你好’,然后 Ioc 这个类 ref=“biz.*”让每个类都注入即可实现
Spring 中 Autowired 和 Resource 关键字的区别
@Resource 和 @Autowired 都是做 bean 的注入时使用,其实 @Resource 并不是 Spring 的注解,它的包是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。1 、共同点两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方法。2 、不同点(1) @Autowired@Autowired为Spring提 供 的 注 解, 需 要 导 入 包org.springframework.beans.factory.annotation.Autowired; 只按照 byType 注入。
public class TestServiceImpl {
// 下面两种@Autowired 只要使用一种即可
@Autowired private UserDao userDao;
// 用于字段上
@Autowired public void setUserDao(UserDao userDao) {
// 用于属性的方法上 this.userDao = userDao; }
}
@Autowired
注解是按照类型(
byType
)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允
许
null
值,可以设置它的
required
属性为
false
。如果我们想使用按照名称(
byName
)来装配,可以结
合
@Qualififier
注解一起使用。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Resource
@Resource
默认按照
ByName
自动注入,由
J2EE
提供,需要导入包
public class TestServiceImpl {
// 下面两种@Resource 只要使用一种即可 @Resource(name="userDao") private UserDao userDao;
// 用于字段上 @Resource(name="userDao") public void setUserDao(UserDao userDao) {
// 用于属性的 setter 方法上 this.userDao = userDao; } }
@Resource
有两个重要的属性:
name
和
type
,而
Spring
将
@Resource
注解的
name
属性解析为
bean
的
名字,而
type
属性则解析为
bean
的类型。所以,如果使用
name
属性,则使用
byName
的自动
注入策
略,而使用
type
属性时则使用
byType
自动注入策略。如果既不制定
name
也不制定
type
属性,这
时将通
过反射机制使用
byName
自动注入策略。