1- Servlet API中forware()和redirect()的区别?
答:
a、浏览器显示
重定向会改变URL地址,请求转发不会改变URL地址。
b、资源共享
重定向不可以资源共享,请求转发可以。
c、功能
重定向可以用URL绝对路径访问其他Web服务器的资源,而请求转发只能在一个Web
应用程序内进行资源转发,即服务器内部的一种操作。
d、效率
重定向效率低,相当于再一次请求;请求转发效率相对较高,跳转仅发生在服务器端。
2- request.getParameter()和request.getAttribute()的区别?
答:
a、request.getParameter()获取的类型是String;
request.getAttribute()获取的类型是Object
b、request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;
request.getAttribute()获取的是对象容器中的数据值/对象
c、request.setAttribute()和request.getAttribute()可以发送、接收对象;
request.getParamter()只能接收字符串,官方不开放request.setParamter()(也就是没有这个方法)
setAttribute()和getAttribute()的传参原理:
setAttribute()是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另外一个页面时,应用服务器会把这块内存拷贝到另一个页面所对应的那块内存中。这个就可以通过getAttribute()获取到相应的参数值或者对象。
3- JSP常用指令有哪些?
答:page、include、taglib
a、page指令:定义页面的一些属性,常用属性:
contentType="text/html;charset=utf-8"; 向浏览器端输出数据的编码
pageEncoding="utf-8"; JSP编译成java文件时所用的编码
session="true" 是否自动创建session
b、include指令:引入一个静态的JSP页面
c、taglib指令:引入一个标签库
4- JSP中动态include和静态include的区别?
答 : a、静态include:语法:<%@ include file="文件名" %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。
b、动态include:语法:<jsp:include page="文件名">,能够自动检查被包含文件,当客户端对JSP文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。
5- 详细描述MVC。
答:基于java的web应用系统采用MVC设计模型,即用Model(模型)、View(视图)和Controller(控制)分离设计,这是目前web应用服务系统的主流设置方向。
Model:处理业务逻辑的模块。
View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。
Controller:负责每个请求的分发,把Form数据传递给Model进行处理,处理完成后,把处理结果返回给相应的View显示给用户。
6- 我们在web应用开发过程中经常遇到输出某种编码的字符,如一个字符串iso-8859-1编码怎么转UTF-8编码?
public String Translate(String str)
{
String s="";
try{
s=new String(str.getBytes("iso-8859-1"),"UTF-8");
s=str.trim();
}catch(Exception e){
System.err.println(e.getMessage());
} return s;
}
7- javascript常用的方面?
答:数据校验、页面特殊效果等。
8- cookie和session的作用、区别、应用范围。
答:a、cookie数据保存在客户端,session数据保存在服务端。
b、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,相当重要的数据,应该使用session保存到服务端。
c、session会在一定时间内保持在服务器上,但是会占用内存资源,当访问的用户过多,会加重服务器的负载,考虑到减轻服务器的压力,可以将不重要的数据放在cookie中持久的保存。
d、单个cookie保存的数据不能超过4k,很多浏览器都限制站点最多保存20个cookie。
9- JSP如何处理运行时异常(run-time)exception?
答:可是使用页面的errorPaga属性捕捉没有处理的运行时异常,然后自动转向到一个错误处理页面,代码如下:
<%@page errorPage="错误页面URL"%>
如果在页面请求时出现运行时异常时,以上代码会将代码转向到错误页面,在错误页面里面,可以通过以下代码定义这个页面是错误处理页面:
<%@page isErrorPage="true"%>
这样描述错误信息的Throwable对象就可以在错误页面里面访问到。
10- 在JSP页面中如何删除一个cookie?
答:
<%
Cookie cookie=new Cookie("cookie名","cookie值");
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
%>
11- Tomcat根目录下目录含义?
答:
a、config:配置文件存放路径
b、webapps:项目部署的目录
c、bin Tomcat运行需要的脚本与jar的目录
d、lib:运行项目时所需要的jar的目录
e、work:部署项目的缓存目录
f、temp:临时文件的存放目录
g、logs:记录日志的目录
12- 乱码如何解决?
答:
a、JSP页面乱码
<%@page contentType="text/html;charset=utf-8" %>
b、表单提交时出现乱码
request.setCharacterEncoding("utf-8");
c、数据库出现乱码
jdbc:mysql://localhost:3306:/user?useSSL=false&useUnicode=true&characterEncoding=utf-8;
13- 单例模式中的懒汉模式和饿汉模式是什么?代码分别怎么实现?区别又是什么?
1.懒汉模式:顾名思义,他是一个懒汉,他不愿意动弹。什么时候需要吃饭了,他就什么时候开始想办法
搞点食物。
即懒汉式一开始不会实例化,什么时候用就什么时候new,才进行实例化。
2.饿汉模式:顾名思义,他是一个饿汉,他很勤快就怕自己饿着。他总是先把食物准备好,什么时候需要
吃了,他随时拿来吃,不需要临时去搞食物。
即饿汉式在一开始类加载的时候就已经实例化,并且创建单例对象,以后只管用即可。
懒汉模式代码:
public class Singleton {
//默认不会实例化,什么时候用就什么时候new
private static Singleton instance = null;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
//什么时候用就什么时候new
instance = new Singleton();
}
return instance;
}
}
饿汉模式代码:
public class Singleton {
//一开始类加载的时候就实例化,创建单实例对象
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
懒汉式和饿汉式的安全和性能区别:
(1) 线程安全:饿汉式在线程还没出现之前就已经实例化了,所以饿汉式一定是线程安全的。懒汉式加
载是在使用时才会去new 实例的,那么你去new的时候是一个动态的过程,是放到方法中实现的,比如:
public static synchronized Singleton getInstance(){
if(instance == null){
//什么时候用就什么时候new
instance = new Singleton();
}
如果这个时候有多个线程访问这个实例,这个时候实例还不存在,还在new,就会进入到方法中,有多少
线程就会new出多少个实例。一个方法只能return一个实例,那最终return出哪个呢?是不是会覆盖
很多new的实例?这种情况当然也可以解决,那就是加同步锁,避免这种情况发生 。
(2)执行效率:饿汉式没有加任何的锁,因此执行效率比较高。懒汉式一般使用都会加同步锁,效率比饿
汉式差。
(3)内存使用:饿汉式在一开始类加载的时候就实例化,无论使用与否,都会实例化,所以会占据空间,
浪费内存。懒汉式什么时候用就什么时候实例化,不浪费内存。
14- 将字符串 2008-10-19 10:11:30.345 转化为 2008年10月19日 10时11分30秒345毫秒怎么做?
public void test () {
String strDate = "2008-10-19 10:11:30.345" ;
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ; // 实例化模板对象
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒SSS毫秒") ;
Date d = null ;
try{
d = sdf1.parse(strDate) ;
}catch(Exception e){
e.printStackTrace() ;
}
String s = sdf2.format(d); // 将日期格式化为字符串 2008年10月19日 10时11分30秒345毫秒
System.out.println(s);
}