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"); } }