Servlet、jsp期末复习
选择题
-
Tomcat webapps目录的作用是什么
用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序,可以以文件夹、war包的形式发布应用。
-
访问tomcat 的URL的正确格式是什么
访问Tomcat的URL格式:http://ip:port
访问本机Tomcat的URL格式:http://localhost:8080
-
Tomcat 组件中context组件中的path属性的作用
Context是Host的子组件,代表指定一个Web应用,它运行在某个指定的虚拟主机(Host)上;每个Web应用都是一个WAR文件,或文件的目录。
path:context path既浏览器访问项目的访问路径
-
Servlet技术特点是什么
Servlet使用单进程多线程的方式运行
-
如下对servlet生命周期描述错误的是
Servlet的生命周期是由容器管理的,分别经历三各阶段:
init():初始化
service():服务
destroy():销毁
当客户端浏览器第一次请求Servlet时,容器会实例化这个Servlet,然后调用一次init方法,并在新的线程中执行service方法处理请求。service方法执行完毕后容器不会销毁这个Servlet而是做缓存处理,当客户端浏览器再次请求这个Servlet时,容器会从缓存中直接找到这个Servlet对象,并再一次在新的线程中执行Service方法。当容器在销毁Servlet之前会调用一次destroy方法。
-
Servlet context的作用是哪几个
相对路径转绝对路径
获取容器的附加信息
读取配置信息
全局容器
-
Cookie对象和session对象的作用是什么
Cookie对象与HttpSession对象的作用是维护客户端浏览器与服务端的会话状态的两个对象。
-
Cookie对跨域支持的策略是什么
域名分类:域名分为顶级域、顶级域名(一级域名)、二级域名。
Cookie不支持一级域名的跨域,支持二级域名的跨域。
-
如下对filter过滤器说法正确的是
1、过滤器作用
Filter过滤器是Servlet2.3中所提供的一个过滤请求与响应的对象。
Filter过滤器既可以对客户端向服务器端发送的请求进行过滤,也可以对服务器端向客户端产生的响应进行过滤处理。
2 、Filter对象的创建
创建一个Class实现Filter接口,并实现接口中三个抽象方法。
init()方法:初始化方法,在创建Filter后立即调用。可用于完成初始化动作。
doFilter()方法:拦截请求与响应方法,可用于对请求和响应实现预处理。
destroy()方法:销毁方法,在销毁Filter之前自动调用。可用于完成资源释放等动作。
3、在Filter中设置请求编码 需求:在Filter中实现对请求的编码的设置。
-
Filter的执行顺序是什么
按照在web.xml文件中配置的上下顺序来决定先后。在上的先执行,在下的后执行。
-
监听器 哪些对象有监听器 如下哪个对象没有监听器
按监听的对象划分,可以分为:
ServletContext对象生命周期监听器与属性操作监听器;
HttpSession对象生命周期监听器与属性操作监听器;
ServletRequest对象生命周期监听器与属性操作监听器;
-
Jsp是哪两种技术对象的复合体
JSP就是HTML与Java代码的复合体
-
与Jsp本质相同的技术是什么(Jsp的本质)
JSP和Servlet是本质相同的技术
-
Http协议是指什么东西
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的 缩写, HTTP是万维网(WWW:WorldWide Web)的数据通信的基础。
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
-
Http协议的特点
支持客户端/服务端模式:
HTTP协议支持客户端服务端模式,需要使用浏览器作为客户端来访问服务端。
简单快速:
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST等。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
无连接:
每次请求一次,释放一次连接。所以无连接表示每次连接只能处理 一个请求。优点就是节省传输时间,实现简单。我们有时称这种无连接为短连接。对应的就有了长链接,长连接专门解决效率问题。当建立好了一个连接之后,可以多次请求。但是缺点就是容易造成占用资源不释放的问题。当HTTP协议头部中字段Connection:keep-alive表示支持长链接
单向性:
服务端永远是被动的等待客户端的请求。
无状态:
HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决HTTP协议无状态,于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
简答题
-
请简述servlet的作用
获取用户提交的数据
获取浏览器附加的信息
处理数据(访问数据库或调用接口)
给浏览器产生一个响应
在响应中添加附加信息 -
请简述转发和重定向的区别
请求转发对于客户端浏览器而言是在一次请求与响应中完成,而重定向是在两次请求两次响应中完成。
请求转发并不会改变客户端浏览器的地址栏中的内容。而重定向会改变客户端浏览器地址栏中的内容。
请求转发可以使用request对象传递数据,而重定向不能使用request对象传递数据。
如果是处理的DML操作,建议使用重定向方式为客户端浏览器产生响应,可以解决表单重复提交现象。
-
请简述什么是会话,说说session和cookie的区别
会话指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求响应的过程。
HttpSession与Cookie的区别:
cookie数据存放在客户的浏览器或系统的文件中,而HttpSession中的数据存放在服务器中。
cookie不安全,而HtptSession是安全的。
单个cookie保存的数据不能超过4K,很多浏览器都限制一个域名保存cookie的数量。而HttpSession没有容量以及数量的限制。
-
请简述用户访问localhost:8080/servletdemo/helloworld时tomcat的运行过程是什么
用户访问http://localhost:8080/servletdemo/helloworld,请求被发送到Tomcat,被监听8080端口并处理 HTTP/1.1 协议的Connector获得。
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
Engine获得请求localhost:8080/servletdemo/helloworld,匹配所有的虚拟主机Host。
Engine匹配到名为localhost的Host虚拟主机来处理/servletdemo/helloworld请求(即使匹配不到会请求交给默认Host处理)。
如果配置有Context的话,交给匹配到的Context获得请求/helloword。
构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloWorld的doGet()或doPost()执行业务逻辑、数据存储等程序。
Context把执行完之后的结果通过HttpServletResponse对象返回给Host。
Host把HttpServletResponse返回给Engine。
Engine把HttpServletResponse对象返回Connector。
Connector把HttpServletResponse对象返回给客户Browser。
应用题
-
当客户端浏览器第一次访问Servlet时响应“您好,欢迎您第一次访问!”,第二次访问时响应“欢迎您回来!”。(cookie/session)
cookie
@WebServlet("/welcomeServlet1") 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("welcome".equals(cookie.getName())){ flag = true; break; } } } resp.setContentType("text/plain;charset=utf-8"); PrintWriter pw = resp.getWriter(); if(flag){ pw.println("欢迎回来"); } else{ pw.println("欢迎你第一次访问"); Cookie cookie = new Cookie("welcome","hc"); cookie.setMaxAge(60); //通过响应对象将Cookie返回给客户端浏览器 resp.addCookie(cookie); } } }
session
@WebServlet("/welcomeServlet2") public class WelcomeServlet2 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("欢迎你回来!"); } } }
-
文件上传 / 文件下载
文件下载
@WebServlet(urlPatterns = {"/filedown"}) public class FileDownServlet 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("image/lbxx.jpg")); File file = new File(getServletContext().getRealPath(value + "/lbxx.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(); } }
文件上传
@WebServlet(urlPatterns = {"/fileUpload"}) @MultipartConfig public class FileUploadServlet 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); } }