基于Servlet面试题进行JavaWeb入门学习
常见面试题
1、说一说Servlet生命周期
2、Post和Get在servlet处理中有何区别
3、转发与重定向的区别
4、 编写Servlet需要继承的类是什么?
5、编写Servlet通常需要实现的两个方法是什么?
6、要获取用户信息,如何获取
7、如何配置servlet
Servlet基础
Servlet基础
Servlet是运行在服务器上的Java小程序,B/S架构的应用需要访问数据库、或一些逻辑处理,均由servlet进行处理,他用来扩充基于http协议的web服务器。
Servlet生命周期包括三部分:
初始化:Web容器加载servlet,调用init()方法
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。
HTTP协议
HTTP协议属于应用层协议,那么基于TCP通信,分为非持续和持续型。
客户端(一般是浏览器)发起80端口(一般)http请求,位于指定ip的并且监听该端口的服务器进行响应。
http方式指的则是GET、POST等动词,代表了对于url(统一资源定位符)和uri(统一资源标识符)的相关操作,http那么我们最熟悉的就是通过浏览器的地址栏,发送http请求,而地址栏填入的信息,例如www.baidu.com,就是发送向百度的ip地址所在的服务器请求页面,而地址栏的操作对应的http方式则是GET,目的是获取页面。而对于一个页面的请求http://localhost:8080/index?username=javatree,他能收到什么样的请求呢?
这是运行在我的电脑上的服务器所接受到的请求消息,那么第一行GET则是标志着对于url的操作,紧跟着的就是所获取资源的地址:/index,是从我们的localhost:8080后面开始的,localhost是本机地址,8080为服务器端口,后面跟着资源名,再后面则是对应的协议标准,使用HTTP/1.1协议。
Servlet基本流程
最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
1. 客户端发送请求至服务器端;
2. 服务器将请求信息发送至(对应的)Servlet;
3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4. 服务器将响应返回给客户端。
拿上面的图来举例子,服务器收到请求,解析出请求地址为/index,找到对应处理/index请求的servlet,然后找到对应处理GET请求的doGet函数,传入的参数存放在HttpServletRequest请求中,即我们的username,那么处理函数处理结束后,交给浏览器一个资源(页面,图片,xml数据),通过response交互,然后浏览器拿到服务器给的资源后显示在浏览器中,完成整个响应.
Servlet常用对象
Request:封装用户提交信息,每次请求都会产生一个新的request,生命周期:一次请求,常用函数:
1. setAttribute()在Request域中存储数据
2. setCharacterEncoding()设置请求参数的编码方式,只对post请求有效
3. getMethod()获取请求类型
4. getParameter()获取指定请求参数值
5. getParameterNames()获取所有请求参数,返回一个Enumeration枚举类
6. getAttribute()获取域中存储的数据
7. getAttributeNames()获取域中所有数据,返回一个Enumeration枚举类
8. getContextPath()返回当前WEB项目相对路径
9. getCookies()获取所有Cookie,返回一个Cookie数组
10. getRequestDispatcher()获取转发器,参数路径以/打头,代表WebRoot(当前WEB项目根目录)
11. getSession()获取Session对象
Response:对客户的请求做出动态的响应,向客户端发送数据。生命周期:一次请求,常用函数:
1. setContentType()告知浏览器数据类型
2. setCharacterEncoding设置Response的编码方式
3. setHeader()设置消息头
4. setStatus()设置状态吗
5. addCookie()添加Cookie
6. sendRedirect()重定向
7. getOutputStream()获取通向浏览器的字节流(同一次请求处理中,字节流和字符流不能同时存在)
8. getWriter()获取通向浏览器的字符流(同一次请求处理中,字节流和字符流不能同时存在)
Session:一次会话,jsp内置对象,在jsp页面被装载后创建。生命期:从打开浏览器连接服务器开始,会为该次会话创建session,直到关闭浏览器结束。用途多在需要保存用户信息以供调用或一些需要较久保存的数据
ServletContext :应用程序开启到结束,共享。
创建一个servlet
创建servlet需要导入对应的java servlet-api包,并将想要成为servlet处理的类继承HttpServlet即可
添加路径映射
Servlet添加url到servlet有两种方法
第一种:使用注解
上例则是使用注解方式,在继承了httpservlet的类使用webservlet注解进行映射,所有请求/validateCodeCheck的请求都会在这个类进行执行,那么httpservlet较多被重写的函数有:doPost,doGet,doHead(用的较少)。
第二种:添加mapper
在web.xml下
Servlet-name是给下面的servlet-class起的名称,servlet-class则是处理的完整包路径+类名
添加映射,url-pattern则是想要映射到的地址,而servlet-name则是处理该请求的servlet名称,在上面的servlet定义的
可以看到在httpservlet基类中定义了响应的method,只需要重写想要响应的请求对应的函数即可,比如在此例中我们重写doGet
doGet(HttpServletRequest req,HttpServletResponse resp){
String user = req.getParameter(”username”);
System.out.println(user);
}
我们就能看到输出了在浏览器中输入的javatree,那么如何返回页面呢?
第一种:重定位(sendRedirect)
将页面重新定位至指定文件,这属于response的方法,通知服务器访问指定资源,但是当前请求结束,因此会发送新的request、response向转发资源,之前做的将不会继承到新资源的请求中去
第二种:请求转发(getRequestDispatch)
属于request方法,能够使用forward传递request和response,能够保留当前操作
示例:
注意调用的对象
request.setAttribute("username","javaTree");
response.sendRedirect("home.jsp");//重定向
request.getRequestDispacther("home.jsp").forword(request,response); //请求转发
1、当用request.getRequestDispacther("/index.jsp").forword(request,response); 请求转发后,结果页面输出:javaTree
2、当用response.sendRedirect("/index.jsp");重定向后,结果页面输出:null
请求不同资源
Jsp文件:
请求:<form action="/validateCodeCheck" method="POST">
页面请求登录,重定向至index.jsp,浏览器收到服务器解析好的页面文件
图片:
请求:<img alt="验证码" id="scode" src="<%=request.getContextPath() %>/getCode" >
通过图片io操作向response的输出流中写入图片,完成图片的响应
本次使用例子: http://git.oschina.net/Efin/Servlet