找工作有一段时间啦, 走了不少弯路; 特此提醒, 基础很重要, 笔试题是打开大门的钥匙; 机会虽然很多, 但一定要牢牢把握住每一次; 拥有选择的权利, 不论是心情还是未来都将是无怨无悔的!
struts2:
Struts2 是一个基于 MVC 设计模式的 web 应用框架, 它本质上相当于一个 servlet, 在 MVC 设计模式中, Struts2 作为控制器 (Controller) 来建立模型与视图的数据交互 Struts 2 的 Action 是一个请求对应一个实例 (每次请求时都新 new 出一个对象), 没有线程安全方面的问题
Struts 2 相比 Struts 1 的优点:
1 在软件设计上 Struts 2 没有像 Struts 1 那样跟 Servlet API 和 struts API 有着紧密的耦合
Struts 2 的应用可以不依赖于 Servlet API 和 Struts API
2Struts 2 提供了拦截器, 利用拦截器可以进行 AOP 编程
3Struts 2 提供了类型转换器
4Struts 2 提供支持多种表现层技术, 如: JSP freeMarker 等
5Struts 2 的输入校验可以指定方法进行校验
6Struts 2 提供了全局范围包范围和 Action 范围的国际化资源文件管理实现
JSP:
Jsp 包含三个编译指令和七个动作指令
三个编译指令为: pageincludetaglib
七个动作指令为: jsp:forwardjsp:paramjsp:includejsp:pluginjsp:useBeanjsp:setPropertyjsp:getProperty
% @page
[language=Java]
[extends=package.class]
[import= package. class I package. *},]
[session=true I false]
[buffer=none I 8kb I size kb 1
[autoFlush=true I false]
[isThreadSafe=true I false]
[info=text]
[errorPage=relativeURL]
[contentType=mimeType[ ;charset=characterSet] Itext/html;charset= 808859-1]
[isErrorPage= true I false]
%
JSP 中有三种形式的脚本, 要理解这三种脚本, 应该先理解 JSP 的运行模式, JSP 文件有两种形态: 设计时的 JSP 文件和运行时态的 Servlet, 当用户访问一个 JSP 文件的时候, 这个 JSP 文件首先会被编译生成 Servlet 代码, 然后这个 Servlet 会被编译运行, 从而产生动态页面, 所以 JSP 中的 JAVA 脚本都会被作为 Servlet 类中的代码存在
1. 声明式脚本 jsp 中编写方式如下:<%! %> 在 <%! %> 中的的变量和方法都是作为 () 类的成员存在的, 所以这种脚本称作声明式脚本, 用来声明类的成员属性和方法的
2. 普通脚本又称作 Jsp ScriptLet,jsp 中编写方式如下:<% %> 在脚本 <% %> 中的代码是作为 servlet 类的 service 方法的一部分存在的, 即在 <%%> 中的变量是局部变量, 而不能编写方法, 因为 java 中不允许在方法中再直接定义方法, 所以这种脚本称作普通脚本, 因为就是普通的 java 代码
3. 表达式脚本编写方式如下:<%= %> 在 jsp 对应的 servlet 类的 service 方法中 <%= %> 中的内容是作为 out.print() 方法的参数存在的, 作用是在浏览器页面上输出内容, 所以 <%= %> 中必须是有结果的表达式用于输出, 所以这种脚本称作表达式脚本
一 String,StringBuffer, StringBuilder 的区别是什么? String 为什么是不可变的?
1. String 是字符串常量, StringBuffer 和 StringBuilder 是字符串变量 StringBuffer 是线程安全的, StringBuilder 是非线程安全的具体来说 String 是一个不可变的对象, 每次修改 String 对象实际上是创新新对象, 并将引用指向新对象效率很低 StringBuffer 是可变的, 即每次修改只是针对其本身, 大部分情况下比 String 效率高, StringBuffer 保证同步 (synchronized), 所以线程安全 StringBuilder 没有实现同步, 所以非线程安全但效率应该比 StringBuffer 高 StringBuffer 使用时最好指定容量, 这样会比不指定容量快 30%-40%, 甚至比不指定容量的 StringBuilder 还快
二 VECTOR,ARRAYLIST, LINKEDLIST 的区别是什么?
vector 是同步的, arraylist 和 linkedlist 不是同步的底层方面, vector 与 arraylist 都是基于 object[]array 实现的, 但考虑 vector 线程安全, 所以 arraylist 效率上回比 vector 较快元素随机访问上, vector 与 arraylist 是基本相同的, 时间复杂度是 O(1),linkedlist 的随机访问元素的复杂度为 O(n) 但在插入删除数据上, linkedlist 则比 arraylist 要快很多 linkedlist 比 arraylist 更占内存, 因为 linkedlist 每个节点上还要存储对前后两个节点的引用
四 ConcurrentHashMap 和 HashTable 的区别
两者均应用于多线程中, 但当 HashTable 增大到一定程度时, 其性能会急剧下降因为迭代时会被锁很长时间但 ConcurrentHashMap 则通过引入分割来保证锁的个数不会很大简而言之就是 HashTable 会锁住真个 map, 而 ConcurrentHashMap 则只需要锁住 map 的一个部分
五 Tomcat,apache,jboss 的区别
Tomcat 是 servlet 容器, 用于解析 jsp,servlet 是一个轻量级的高效的容器; 缺点是不支持 EJB, 只能用于 Java 应用
Apache 是 http 服务器 (web 服务器), 类似于 IIS 可以用来建立虚拟站点, 编译处理静态页面支持 SSL 技术, 支持多个虚拟主机等功能
Jboss 是应用服务器, 运行 EJB 的 javaee 应用服务器, 遵循 javaee 规范, 能够提供更多平台的支持和更多集成功能, 如数据库连接, JCA 等其对 servlet 的支持是通过集成其他 servlet 容器来实现的如 tomcat
七 SESSION, COOKIE 区别
session 数据放在服务器上, cookie 则放在客户浏览器上 cookie 不太安全, 因为可以分析出本地 cookie, 并进行 cookie 欺骗, 考虑安全应使用 sessionsession 会在一定时间内保存在服务器上, 当访问增多时, 会比较占用服务器的性能, 考虑减轻服务器压力则应该使用 cookie 单个 cookie 保持的数据不超过 4k, 很多浏览器都限制要给站点最多保存 20 个 cookie
八 Servlet 的生命周期
主要分三个阶段: 初始化调用 init() 方法, 响应客户请求阶段调用 service() 方法, 终止阶段调用 destroy 方法工作原理: 客户发送一个请求, servlet 调用 service 方法对请求进行响应, 即对请求方式进行匹配, 选择调用 doGetdoPost 方法等, 然后进入对于的方法中调用逻辑层的方法, 实现对客户的响应自定义的 servlet 必须首先 servlet 接口
具体生命周期包括: 装载 Servlet 服务器创建 Servlet 实例服务器调用 Servlet 的 init() 方法客户请求到达服务器服务器创建请求对象服务创建相应对象服务器激活 Servlet 的 service 方法, 请求对象和响应对象作为 service() 方法的参数 service() 方法获得关于请求对象的信息, 处理请求, 访问其他资源, 获得需要的信息 service() 方法可能激活其他方法以处理请求, 如 doGet(),doPost()
九 HTTP 报文包含内容
(请求行, 请求头部, 请求正文)
请求方法包括 GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE 请求头如: HostUser-AgentConnectionAccept-Charset 等请求头部的最后会有一个空行, 表示请求头部结束, 接下来为请求正文, 这一行非常重要, 必不可少请求正文为可选部分, 如 get 就没有
十 Statement 与 PreparedStatement 的区别, 什么是 SQL 注入, 如何防止 SQL 注入
使用 PreparedStatement 可以提升代码的可读性和可维护性, 可以尽最大可能提高性能因为 Statement 每次执行一个 SQL 命令都会对其编译, 但 PreparedStatement 则只编译一次 PreparedStatement 就类似于流水线生产另一方面 PreparedStatement 可以极大提高安全性: 它对传递过来的参数进行了强制参数类型转换, 确保插入或查询数据时, 与底层数据库格式匹配
SQL 注入: 就是通过将 sql 命令插入到 web 表单递交或输入域名或页面请求的查询字符串, 最终达到欺骗服务器执行恶意 SQL 命令如 sql 命令: select id from test where name=1 or 1=1; drop table test, 但用 PreparedStatement 就可以避免这种问题
十一 redirect, forward 区别
redirect: 服务器根据逻辑, 发送一个状态码, 告诉浏览器重新去请求那个地址所以地址栏显示是新的 urlforward 是指服务器请求资源, 直接访问目标地址 url, 把响应的内容读取过来并再发送给浏览器, 浏览器并不知道资源从哪里来, 所以地址栏不变
redirect 不能共享数据, forward 转发页面和转发到页面可以贡献 request 中的数据 redirect 用于注销, forward 用于登陆 forward 效率高于 redirect
十 Statement 与 PreparedStatement 的区别, 什么是 SQL 注入, 如何防止 SQL 注入
使用 PreparedStatement 可以提升代码的可读性和可维护性, 可以尽最大可能提高性能因为 Statement 每次执行一个 SQL 命令都会对其编译, 但 PreparedStatement 则只编译一次 PreparedStatement 就类似于流水线生产另一方面 PreparedStatement 可以极大提高安全性: 它对传递过来的参数进行了强制参数类型转换, 确保插入或查询数据时, 与底层数据库格式匹配
SQL 注入: 就是通过将 sql 命令插入到 web 表单递交或输入域名或页面请求的查询字符串, 最终达到欺骗服务器执行恶意 SQL 命令如 sql 命令: select id from test where name=1 or 1=1; drop table test, 但用 PreparedStatement 就可以避免这种问题
十二关于 JAVA 内存模型, 一个对象 (两个属性, 四个方法) 实例化 100 次, 现在内存中的存储状态, 几个对象, 几个属性, 几个方法
Java 新建的对象都放在堆里, 如果实例化 100 次, 堆中产生 100 个对象, 一般对象与其属性和方法属于一个整体, 但如果属性和方法是静态的, 则属性和方法只在内存中存一份
mysql 连接数据库
Class.forName(com.sql.jdbc.Driver);
Connection ct=DriverManager.getConnection (jdbc:mysql://127.0.0.1:3360/first,root,123);
PreparedStatement ps=ct.preparedStatement(sql);
ResultSet rs=ps.executeQuery();
float 型 float f=3.4 是否正确?
不正确精度不准确, 应该用强制类型转换, 如下所示: float f=(float)3.4 或 float f = 3.4f 在 java 里面, 没小数点的默认是 int, 有小数点的默认是 double;
structs
1. 是一个框架 (基于 mvc 的一个 web 框架)
2.
(规范化, 效率高, 可读性好, 可维护性增加;)
mvc 模式 (模式是一种思想)(model view control)
将数据的输入, 处理 (model) 和显示分开 (jsp)
对 mvc 的理解不同, 写程序时规范不统一, 不利维护扩展效率, 所以
有了统一的规范 structs
structs 运行原理:
用户登录:
浏览器 web 服务器 ActionServlet(struts-config.xml) actionform Loginaction model jsp
static 表示不要实例化就可以使用被 static 修饰的成员变量和成员方法不依赖类特定的实例, 被类的所有实例共享
对于静态变量在内存中只有一个拷贝 (节省内存),JVM 只为静态分配一次内存, 在加载类的过程中完成静态变量的内存分配, 可用类名直接访问 (方便), 当然也可以通过对象来访问 (但是这是不推荐的)
一般在需要实现以下两个功能时使用静态变量:
在对象之间共享值时 (多个变量共享一个值: 如所有学生公用一个变量学费)
方便访问变量时
类变量是该类的所有对象共享的变量, 任何一个该类的对象去访问它时, 取到的都是相同的值, 任何一个该类的对象去修改它时, 修改的也是同一个变量
静态区域块只被执行一次, 且自动执行不需实例化利用静态代码块可以对一些 static 变量进行赋值
类变量原则上用类方法去访问; 类方法中不许访问非静态变量, 反之可以; 静态方法中不能用 this 和 super 关键字
类方法属于类相关的公共的方法
static 方法独立于任何实例, static 方法必须被实现, 而不能是抽象的 abstract
一般类内部的 static 方法也是方便其它类对该方法的调用
如果一个成员被声明为 static, 它就能够在它的类的任何对象创建之前被访问, 而不必引用任何对象
spring
Spring 是全面的和模块化的 Spring 有分层的体系结构, 你能选择使用它孤立的任何部分, 它的架构仍然是内在稳定的
Spring 作为开源的中间件, 独立于各种应用服务器, 甚至无须应用服务器的支持, 也能提供应用服务器的功能, 如声明式事务事务处理等
Spring 致力于 J2EE 应用的各层的解决方案, 而不是仅仅专注于某一层的方案可以说 Spring 是企业应用开发的一站式选择, 并贯穿表现层业务层及持久层然而, Spring 并不想取代那些已有的框架, 而是与它们无缝地整合
轻量控制反转 ioc 面向切面容器框架 mvc
servlet 生命周期: 创建实例, init 初始化, service 方法处理, destroy 方法销毁
int 是基本类型, 直接存数值
integer 是对象, 用一个引用指向这个对象 (一个类)
int i =1;
Integer i= new Integer(1);(要把 integer 当做一个类看)
Integer 是一个类, 是 int 的扩展, 定义了很多的转换方法
类似的还有: float Float;double Double;string String 等
举个例子: 当需要往 ArrayList,HashMap 中放东西时, 像 int,double 这种内建类型是放不进去的, 因为容器都是装 object 的, 这是就需要这些内建类型的外覆类了
Java 中每种内建类型都有相应的外覆类
Java 中 int 和 Integer 关系是比较微妙的关系如下:
1.int 是基本的数据类型;
2.Integer 是 int 的封装类;
3.int 和 Integer 都可以表示某一个数值;
4.int 和 Integer 不能够互用, 因为他们两种不同的数据类型;
引入的原因: 为了在各种类型间转化, 通过各种方法的调用否则 你无法直接通过变量转化
比如, 现在 int 要转为 String
int a = 0;
String result = Integer.toString(a);
在 java 中包装类, 比较多的用途是用在于各种数据类型的转化中
JVM 是一个桥梁, 是一个中间件, 是实现跨平台的关键, Java 代码首先被编译成字节码文件, 再由 JVM 将字节码文件翻译成机器语言, 从而达到运行 Java 程序的目的
JVM 有一个选项, 可以将使用最频繁的字节码翻译成机器码并保存, 这一过程被称为即时编译这种方式确实很有效,
JVM 自己的命令集, JVM 的命令集则是可以到处运行的, 因为 JVM 做了翻译, 根据不同的 CPU , 翻译成不同的机器语言
Java 中的所有类, 必须被装载到 JVM 中才能运行, 这个装载工作是由 JVM 中的类装载器完成的, 类装载器所做的工作实质是把类文件从硬盘读取到内存中
2. Java 中的类大致分为三种:
a) 系统类
b) 扩展类
c) 由程序员自定义的类
3. 类装载方式, 有两种:
a) 隐式装载, 程序在运行过程中当碰到通过 new 等方式生成对象时, 隐式调用类装载器加载对应的类到 jvm 中
b) 显式装载, 通过 class.forName() 等方法, 显式加载需要的类
来源: http://click.aliyun.com/m/41340/