servlet是什么
- Servlet 是javaEE规范之一。规范就是接口
- servlet 是javaweb 三大组件之一。三大组件分别是 Servlet程序,Filter过滤器,Listen 监听器。
- Servlet 是运行在服务器上的java 程序,它可以接受客户端发送的请求,并响应给客户端。
第一个Servlet程序
- 编写一个类去实现 Servlet 接口
- 实现services方法,处理请求,并响应数据。
- 到web.xml 中配置servlet程序的访问地址。
手动添加servlet jar包
右键 -> open Module setting
新建一个类,继承所有方法。
package com.study.servlet;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
void HelloServlet() {
System.out.println("constructor");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
// 配置 web.xml配置
<servlet>
<!-- 类名称 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 类名加配置 -->
<servlet-class>com.study.servlet.HelloServlet</servlet-class>
</servlet>
<!-- 路径相关 -->
<servlet-mapping>
<!-- 类名 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 路径 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
然后访问 /hello 可以看到打印输出
每一次访问都会执行 `services` 方法,但是 `init` 方法只执行一次。
停止时触发destroy
使用idea快捷生成servlet
package com.study.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 触发post方法时执行
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 触发Get方法时执行
System.out.println("doGet");
}
}
Servlet获取请求参数
request.getParameter("name");
Servlet响应内容
PrintWriter out = response.getWriter();
out.println("hello javaweb servlet");
servlet-api jar包关联
新建lib 目录,复制servlet-api.jar到lib下面
右键lib,mark to Libray
idea 启动 servlet
- 新增启动方式
- 添加项目目录
注解servlet 代替 web.xml 配置(2.5版本以上)
常用配置
name 类名称 对应 servlet-class
value 对应servlet-mapping 中的 <url-pattern>
urlPatterns 和value 一样,对应servlet-mapping 中的 <url-pattern>
loadOnStartup 加载顺序
@WebServlet(name = "Servlet2",value = {"/servlet2","/servlet3"})
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPOST");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
}
}
Request 和 Response
request相关方法
- getMethod(); 获得请求方式
- getRequestURL(); 返回客户端发出请求时的完整URL。
- getRequestURI(); 返回请求行中的资源名部分。
- getContextPath(); 当前应用的虚拟目录
- getQueryString() ; 返回请求行中的参数部分。
- getParameter(); 获取参数 GET/POST 通用
Response相关方法
- response.setStatus(302); // 设置状态码.
- response.setHeader("location","http://www.baidu.com");// 设置响应头
向客户端输出中文数据
- 用OutputStream(字节流)发送数据:
-
- response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据
- response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏览器(默认用GB2312)会出现乱码
- 用PrintWriter(字符流)发送数据:
-
- 示例:response.getWriter().write(“中国” );有没有乱码?
- 原因:以默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码
解决办法:
setCharacterEncoding(“UTF-8”);
//更改编码为UTF-8
response.setHead(“Context-type”,”text/html;charset=UTF-8”);
//告诉客户端编码方式
注意:不要忘记告诉客户端的编码方式。
由于经常改动编码,response提供了一种更简单的方式
response. setContentType(“text/html;charset=UTF-8”); 其作用相当于以上两条代码。
Cookie 和 Response
设置cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
// 添加cookie
response.addCookie(new Cookie("papa", "aa"));
response.addCookie(new Cookie("sid","123"));
// 响应结果
response.getOutputStream().write("hello".getBytes());
}
获取cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
StringBuilder res = new StringBuilder();
String name = null;
String val = null;
// 获取到的cookie是一个 数组
Cookie[] oldSid = request.getCookies();
for (int i = 0;i<oldSid.length;i++){
name = oldSid[i].getName();
val = oldSid[i].getValue();
res.append(name + " : "+ val +"\n");
}
// 添加cookie
response.addCookie(new Cookie("papa", "aa"));
// 添加sid 随机
response.addCookie(new Cookie("sid",String.valueOf(Math.random())));
// 响应结果
response.getOutputStream().write(res.toString().getBytes());
}
设置session
// 获取一个session,如果不存在,则创建
HttpSession session = request.getSession(true);
//设置新的时间
session.setAttribute("t",System.currentTimeMillis());
获取session
// 获取一个session,如果不存在,则创建
HttpSession session = request.getSession(true);
// 获取上次的时间
Object t = session.getAttribute("t");
ServletContext servlet 上下文
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
Filter 过滤器
过滤器是指客户端和请求响应之间的一道过滤技术。
package com.study.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 拦截所有请求
@WebFilter(value = "*")
public class HelloFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
// 如果没有携带auth 属性,则未授权
String auth = servletRequest.getParameter("auth");
if (auth == null) {
System.out.println("未授权");
}
// 继续,等价于express 的next;
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
System.out.println("destroy");
}
}