选择题
-
tomcat Webapps目录的配置目录有什么作用?
webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包的形式发布应用。
-
访问tomcat的url格式是什么?
格式:http://ip:port
本机:http://localhost:8080
-
tomcat组件中context的path属性作用是什么?
path:浏览器访问项目的访问路径。
-
servlet的技术特点:
Servlet使用单进程多线程方式运行。
-
servlet的生命周期:
Servlet的生命周期是由容器管理的,分别经历三各阶段:
- init():初始化
当客户端浏览器第一次请求Servlet时,容器会实例化这个Servlet,然后调用一次init方法,并在新的线 程中执行service方法处理请求。
- service():服务
service方法执行完毕后容器不会销毁这个Servlet而是做缓存处理,当 客户端浏览器再次请求这个Servlet时,容器会从缓存中直接找到这个Servlet对象,并再一次在新的线程 中执行Service方法。
-
destroy():销毁
当容器在销毁Servlet之前对Servlet调用一次destroy方法。
-
servletcontext的作用?
当容器启动时会创建ServletContext对象并一直缓存该对象,直到容器关闭后该对象生命周期结束。 ServletContext对象的生命周期 非常长,所以在使用全局容器时不建议存放业务数据。
-
cookie对象与session的作用?
Cookie对象与HttpSession对象的作用是维护客户端浏览器与服务端的会话状态的两个对象。
-
cookie对于跨域的支持的策略是什么?
域名分类:域名分为顶级域、顶级域名(一级域名)、二级域名。域名等级的区别:一级域名比二级域名更高级,二级域名是依附于一级域名之下的附属分区域名,即二 级域名是一级域名的细化分级。例如:baidu.com 为一级域名,news.baidu.com为二级域名。 Cookie不支持一级域名的跨域,支持二级域名的跨域。
-
filter过滤器
Filter过滤器是Servlet2.3中所提供的一个过滤请求与响应的对象。 Filter过滤器既可以对客户端向服务器端发送的请求进行过滤,也可以对服务器端向客户端产生的响应进行过滤处理。
-
filter的执行顺序?
则按照在web.xml文件中配置的上下顺序来决定先后。在上的先执行,在下的后执行。
-
哪些对象有监听器,哪些没有?
按监听的对象划分,可以分为:
-
ServletContext对象生命周期监听器与属性操作监听器;
-
HttpSession对象生命周期监听器与属性操作监听器;
-
ServletRequest对象生命周期监听器与属性操作监听器;
-
-
jsp是哪两种对象的复合体?
JSP就是HTML与Java代码的复合体。
-
与jsp本质相同的技术是?
JSP和Servlet是本质相同的技术。
-
http协议是指?
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的 缩写, HTTP是万维网(WWW:World Wide Web)的数据通信的基础。 HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的 消息以及得到什么样的响应。
-
http协议的特点?
-
支持客户端/服务端模式: HTTP协议支持客户端服务端模式,需要使用浏览器作为客户端来访问服务端。
-
简单快速: 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST等。每种方法规定 了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度 很快
-
灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来 表示内容类型的标识)加以标记。
-
无连接: 每次请求一次,释放一次连接。所以无连接表示每次连接只能处理 一个请求。优点就是节省传输时间, 实现简单。我们有时称这种无连接为短连接。对应的就有了长链接,长连接专门解决效率问题。 当建立好了一个连接之后,可以多次请求。但是缺点就是容易造成占用资源不释放的问题。当HTTP协议 头部中字段Connection:keep-alive表示支持长链接
-
单向性: 服务端永远是被动的等待客户端的请求。
-
无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需 要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要 先前信息时它的应答就较快。为了解决HTTP协议无状态,于是,两种用于保持HTTP连接状态的技术就 应运而生了,一个是Cookie,而另一个则是Session。
-
简答题
- 简述servlet的作用?
- 获取用户提交的数据
- 获取浏览器附加的信息
- 处理数据(访问数据库或调用接口)
- 给浏览器产生一个响应 在响应中添加附加信息
2.简述转发和重定向的区别?
- 请求转发对于客户端浏览器而言是在一次请求与响应中完成,而重定向是在两次请求两次响应中完成。
- 请求转发并不会改变客户端浏览器的地址栏中的内容。而重定向会改变客户端浏览器地址栏中的内容。
- 请求转发可以使用request对象传递数据,而重定向不能使用request对象传递数据。 如果是处理的DML操作,建议使用重定向方式为客户端浏览器产生响应,可以解决表单重复提交现象。
3.请简述什么是会话和cookie和session的区别?
- 会话 是指一个客户端与web服务器之间连续发生的一系列请求和响应的过程。
HttpSession与Cookie的区别:
- cookie数据存放在客户的浏览器或系统的文件中,而HttpSession中的数据存放在服务器中。
- cookie不安全,而HttpSession是安全的。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个域名保存cookie的数量。而 HttpSession没有容量以及数量的限制。
4.简述用户访问local host 8888\test\helloword的运行过程?
- 用户访问http://localhost:8888/test/helloworld,请求被发送到Tomcat,被监听8888端口并处理 HTTP/1.1 协议的Connector获得。
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
-
Engine获得请求localhost:8888/test/helloworld,匹配所有的虚拟主机Host。
-
Engine匹配到名为localhost的Host虚拟主机来处理/test/helloworld请求(即使匹配不到 会请求交给默认Host处理)。
-
如果配置有Context的话,交给匹配到的Context获得请求/helloword。
-
构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloWorld的doGet ()或doPost()执行业务逻辑、数据存储等程序。
-
Context把执行完之后的结果通过HttpServletResponse对象返回给Host。 http://localhost:8888/test/helloworld Host把HttpServletResponse返回给Engine。 Engine把HttpServletResponse对象返回Connector。 Connector把HttpServletResponse对象返回给客户Browser。
应用题
1. 第一次访问响应为,您好,第一次访问。第二次显示为,欢迎回来!
- cookie:
import java.servlet.*;
import jva.servlet.http.*;
import java.io.*;
public class WelcomeServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
Cookie []cookies = req.getCookies();
boolean flag = false;
if(cookies != null){
for(Cookie cookie : cookies){
if("hyg".equals(cookie.getNmae())){
flag = true;
break;
}
}
}
resp.setContentType("text/plain;charset=utf-8"):
if(flag)
resp.getWriter().println("欢迎您回来!");
else{
resp.getWriter().println("欢迎您第一次访问!");
Cookie cookie = new Cookie("hyg","123");
cookie.setMaxAge(10);
resp.addCookie(cookie);
}
}
}
- session:
import java.servlet,http.*;
import java.servlet*;
import java.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/welcomeServlet")
public class WelcomeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession(false);
if(session == null){
resp.getWriter().println("欢迎您第一次访问!");
req.getSession(); .
} else
resp.getWriter().println("欢迎您回来!");
}
}
2. 文件上传或文件下载
- 文件上传:
import java.servlet.http.*;
import java.servlet.*;
import java.servlet.annotation.*;
import java.io.*;
import java.util.*;
@WebServlet("/fileUpload")
@MultipartConfig
public class FileUpload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//获取文件描述
String desc = req.getParameter("desc");
//获取上传文件
Part part = req.getPart("file");
//处理文件名
String prefix = UUID.randomUUID().toString();
String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."));
String newName = prefix + suffix;
//路径转换
String realPath = getServletContext().getRealPath("suibian/" + newName);
//文件保存
part.write(realPath);
resp.setContentType("text/plain;charset=utf-8");
resp.getWriter().println(desc);
}
}
- 文件下载:
import java.servlet.http.*;
import java.servlet.*;
import java.servlet.annotation.*;
import java.io.*;
@WebServlet("/fileDownload")
public class FileDownload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//读取下载文件
ServletContext servletContext = this.getServletContext();
String value = (String) servletContext.getAttribute("path");
File file = new File(getServletContext().getRealPath(value + "/测试.jpg"));
FileInputStream inputStream = new FileInputStream(file);
//在响应中添加附加信息
resp.addHeader("Content-Disposition", "attachment;filename=" + new
String(file.getName().getBytes("gbk"), "iso-8859-1"));
//产生响应
ServletOutputStream outputStream = resp.getOutputStream();
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1)
{
outputStream.write(data,0,len);
}
inputStream.close();
outputStream.close();
}
}