Servlet
1 Tomcat
- 官网下载(http://tomcat.apache.org/)相应版本解压即可使用
1.1 Tomcat目录结构
文件夹 | 说明 | 备注 |
---|---|---|
bin | 该目录下存放的是二进制可执行文件 | startup.bat启动Tomcat、shutdown.bat停止Tomcat |
conf | 这是一个非常重要的目录,这个目录下有两个最为重要的文件server.xml和web.xml | server.xml:配置整个服务器信息。例如修改端口号,编码格式等。 web.xml:项目部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。 |
lib | Tomcat的类库,里面存放Tomcat运行所需要的jar文件。 | |
logs | 存放日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,异常也会记录在日志文件中。 | |
temp | Tomcat的临时文件,这个目录下的东西在停止Tomcat后删除。 | |
webapps | 存放web项目的目录,其中每个文件夹都是一个项目;其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。 | |
work | 运行时生成的文件,最终运行的文件都在这里。 | 当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。 |
1.2 修改端口号
- Tomcat默认端口号为8080,可以通过conf/server.xml文件修改
* 8080:监听用户业务处理的端口
* 8005:监听关闭tomcat的端口
* 8009:多个tomat之间同步数据的端口
1.3 设置用户权限
- 可以在conf/tomcat-users.xml中设置
2 HTTP协议
- 是一个基于请求与响应模式的,无状态的应用层协议,运行于TCP协议基础之上。
2.1 HTTP协议特点
- 支持客户端(浏览器)/服务器模式
- 简单快速:请求方法常用的有Get、Post等
- 灵活:HTTP允许传输任意类型的数据,传输的数据类型由Content-Type标识
- 无连接:每次TCP连接只处理一个或多个请求,服务器处理完客户的请求后,即断开连接
- 无状态:HTTP协议对于事务处理没有记忆能力
2.2 HTTP请求报文
2.3 HTTP响应报文
3 Servlet
- 服务器端程序,可交互式的处理客户端发送到服务端的请求,并完成响应操作
- JavaWeb程序开发的基础,JavaEE规范的一个组成部分
- 动态网页技术
3.1 作用
- 接收客户端请求,完成操作
- 动态生成网页
- 将包含操作结果的动态网页响应给客户端
3.2 编写Servlet的两种方式
- 实现Servlet接口,实现5个主要方法
* init(ServletConfig config)
* ServletConfig getServletConfig()
* service(ServletRequest req,ServletResponse res)
* String getServletInfo()
* destroy()- 继承HttpServlet类,重写doGet()和doPost()方法
3.3 web.xml中配置Servlet
<!--1、添加servlet节点-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.qf.servlet.MyServlet</servlet-class>
</servlet>
<!--2、添加servlet-mapping节点 -->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
3.4 使用注解配置Servlet
/**
* Servlet implementation class HelloServlet
* 演示Servlet注解式配置
*/
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("OK");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- @WebServlet注解常用属性
* name:Servlet的名字
* value:配置url路径,可以配置多个
* urlPatterns:和value一样,不能同时使用
* loadOnStratup:Servlet创建的优先级
3.5 Request对象
- 常用方法:
* getParameter(String name):根据表单组建名称获取数据
* setCharacterEncoding(String charset):指定每个请求的编码
3.6 Response对象
- 常用方法:
* setHeader(name,value):设置响应头信息
* setContentType(String):设置响应文件类型、编码格式
* setCharacterEncoding(String):设置响应内容的编码格式
* getWriter():获取字符输出流
3.7 转发
- 在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理
request.getRequestDispatcher("/目标URL-pattern").forward(request, response);
- 是在服务器内部跳转,地址栏不发生改变,属于同一次请求,可以共享同一次request作用域中的数据
- 存数据:request.setAttribute(String key,Object value);
- 取数据:request.getAttribute(String);
- 只能转发给同一个Web应用中的组件
3.8 重定向
- 重定向只作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的地址,客户端重新发送新请求
response.sendRedirect("目标URI");
- 是在客户端跳转,地址栏发生变化,属于多次请求
- response没有作用域,两次request请求中的数据无法共享
- 重定向可以指向任何资源
3.9 Servlet执行流程
3.10 解决Servlet线程安全问题
- 使用同步锁
- 使用ThreadLocal管理
- 尽量使用局部变量
4 Coocie
- Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应头中附带传送给浏览器的一小段数据
- 优点:
* 可配置到期规则
* 简单性:一种基于文本的轻量结构,包含简单的键值对
* 数据持久性:Co okie默认在过期之前是可以一致存在客户端浏览器上的- 缺点:
* 大小受到限制
* 用户可配置为禁用Cookie
* 潜在的安全风险:存在客户端,可能会被篡改
4.1 常用方法
- 创建Cookie
Cookie ck = new Cookie("code",code);
//设置Cookie的路径
ck.setPath("/webs");
//设置超时时间:默认-1:内存存储;0:立马销毁;>0:有效期,单位为秒
ck.setMaxAge(-1);
//将Cookie响应给客户端
response.addCookie(ck);
- 获取Cookie
//获取所有的Cookie
Cookie[] cks = request.getCookies();
- Cookie编码与解码
//编码
URLEncoder.encode("姓名","UTF-8");
//解码
URLDecoder.decode("姓名","UTF-8");
5 Session对象
- 用于记录用户状态,在一段时间内,单个用户与Web服务器的一连串相关的交互过程
- 服务器会为每一次会话分配一个Session对象
- 同一个浏览器发起的多次请求,属于同一次会话
- 首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送给客户端
5.1 Session作用域
- 作用范围是一次会话有效,可以在一次会话的任意位置进行获取
- 可以传递任何数据
5.2 常用方法
//获取Session对象
HttpSession session = request.getSession();
//将数据存放到session作用域中,以键值对的形式存储
session.setAttribute("key",value);
//从session作用域中获取数据
Object value = session.getAttribute("key");
//从session作用域中移除数据
session.remove("key");
//设置session超时时间,单位为秒,默认为30分钟
session.setMaxInactiveInterval(60);
//手动销毁session
session.invalidate();
6 ServletContext对象
- 全局作用域,对应一个Tomcat中的Web应用
- 当Web服务器启动时,会为每个Web应用创建一个ServletContext,服务器关闭时销毁
6.1 常用方法
//获取ServletContext对象的三种方式
//1.通过GenerricServlet对象获取
ServletContext sc = this.getServletContext();
//2.通过HttpServletRepuest对象获取
ServletContext sc = request.getServletContext();
//3.通过HttpSession对象获取
ServletContext sc = session.getServletContext();
//获取项目真实路径
String realPath = sc.getRealPath("/");
//获取项目上下文路径
String contentPath = sc.getContentPath();
//存储数据
sc.setAttribute("key",value);
//获取数据
sc.getAttribute("key");
//移除数据
sc.remove("key");
7 Request、Session和ServletContext作用域的区别
- Request:一次请求,请求响应之前有效
- Session:一次会话,浏览器不关闭或不超时之前有效
- ServletContext:服务器启动时开始,服务器关闭之前有效