初步使用
创建项目
创建Java Enterprise项目,项目结构如下
1、其中pom.xml文件默认已经添加javax.servlet-api依赖
2、web.xml是配置文件;因为Tomcat默认回去目录下寻找index.html,index.jsp名的文件当作首页,所以运行项目的时候,会显示index.jsp文件的内容
3、在idea中可以直接创建定义好的servlet类,如果勾选了Create Java EE 6+ annotated class创建的类会带有注解,在servlet的xml配置文件中可以不配置servlet
创建自定义的Servlet类
package com.fssx.TestWeb;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
// 使用注解的方法配置servlet,name是servlet的自定义名称,value是访问的地址,loadOnStartup表示会在tomcat启动的时候就直接加载servlet,而不用等待我们访问才加载,数值越大越先加载
@WebServlet(name = "test", value = "/test", loadOnStartup = 15)
public class ServletIndex extends HttpServlet {
// 初始化方法会在第一次加载这个servlet时调用,后续每次再访问的时候不再调用
@Override
public void init() throws ServletException {
System.out.println("调用init方法");
}
// 每次访问的时候都会调用
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("调用service方法");
super.service(req, res);
}
// 根据请求方式分配调用的方法,常用的是Get和Post方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=null;
// 获取所有的参数名
Enumeration parameters = request.getParameterNames();
// 判断集合内是否有元素
while (parameters.hasMoreElements()) {
// 获取元素key
String key= (String) parameters.nextElement();
// 通过key获取value
name = request.getParameter(key);
}
if (name == null) {
name = "World";
}
Cookie cookie = new Cookie("name", name);
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
System.out.println("调用doGet方法");
// 设置响应内容的格式,如果不设置为utf-8,默认使用的是iso-8859-1,对于中文会有乱码
response.setContentType("text/html;charset=UTF-8");
// 创建自动缓冲字符输出流
PrintWriter writer = response.getWriter();
// 将字符串写入输出流中
writer.println("<h1>Hello</h1>");
writer.println("<h1>"+name+"</h1>");
writer.println("<a>!</a>");
writer.println("<a>!</a>");
writer.println("<a>!</a>");
}
// 根据请求方式分配调用的方法,常用的是Get和Post方法
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用doPost方法");
// 设置请求内容的格式,如果不设置为utf-8,默认使用的是iso-8859-1,对于中文会有乱码
request.setCharacterEncoding("utf-8");
Cookie [] cookies = request.getCookies();
if (cookies.length>=1){
String key = cookies[0].getName(), value = cookies[0].getValue();
System.out.println("cookie中的"+key+"的值为"+value);
}
String name = request.getParameter("name");
if (name == null) {
name = "World";
}
System.out.println(name);
}
// 在servlet销毁时调用(使用tomcat关闭,而非关闭网页时)
@Override
public void destroy() {
System.out.println("调用destroy");
}
}
修改Xml配置文件
xml配置和注解配置二选一
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 将servlet类添加别名-->
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.fssx.TestWeb.ServletIndex</servlet-class>
<load-on-startup>15</load-on-startup>
</servlet>
<!-- 将servlet和访问路径匹配-->
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>S
这时候我们的网页已经可以访问了,servlet的生命周期
1、加载阶段:加载并实例化(创建Servlet实例),调用构造方法
2、初始化阶段:调用init()方法(第一次实例化Servlet时调用,后续不会创建新的)
3、响应客户请求阶段:调用service()方法,根据请求方式调用doGet、doPost
4、终止阶段:调用destroy()方法(Tomcat关闭时调用)
常用方法
1、获取前端发送的参数
Enumeration parameters = request.getParameterNames();
//判断集合内是否有元素
while (parameters.hasMoreElements()) {
// 获取元素key
String key= (String) parameters.nextElement();
// 通过key获取value
name = request.getParameter(key);
}
2、获取、插入Cookie
Cookie cookie = new Cookie("name", "李四"); // 创建新的Cookie
cookie.setMaxAge(60*60*24); // 设置存活时间为1天
response.addCookie(cookie); // 添加Cookie到响应体中
Cookie [] cookies = request.getCookies(); // 获取所有的Cookie对象
String key = cookies[0].getName(); // 获取数组中第一个Cookie的Name
String value = cookies[0].getValue(); // 获取数组中的第一个Cookie的Value
3、设置编码格式
request.setCharacterEncoding("utf-8"); // 设置请求体的解析编码格式
response.setContentType("text/html;charset=UTF-8"); // 设置响应体的解析编码格式
过滤器
package com.fssx.Filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
// 使用注解配置就不需要配置xml了,二选一 filterName为过滤器自定义名词,servletNames,urlPatterns为匹配路径
@WebFilter(filterName = "FilterOne",servletNames = "test")
public class FilterOne implements Filter {
// 初始化方法
public void init(FilterConfig config) throws ServletException {
System.out.println("调用过滤器init方法");
}
// 销毁方法
public void destroy() {
System.out.println("调用过滤器destroy方法");
}
// 过滤方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("开始过滤");
String name = request.getParameter("name");
if ("lisi".equals(name)) {
// 程序正常往下运行,执行下一个过滤器或者回到servlet中
chain.doFilter(request, response);
// 请求返回后继续执行后面的内容
System.out.println("返回过滤");
} else {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer= response.getWriter();
writer.println("错误,用户名不是lisi");
}
}
}
xml配置
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filterOne</filter-name>
<filter-class>com.fssx.Filter.FilterOne</filter-class>
</filter>
<filter-mapping>
<filter-name>filterOne</filter-name>
<servlet-name>test</servlet-name>
</filter-mapping>
问题
使用中文出现乱码
1、post请求的中文参数乱码
request.setCharacterEncoding("utf-8");
对于请求的参数,get请求的参数保存在请求头中,由tomcat使用utf-8解码,能够正常显示
而post请求的参数保存在请求体重,由request解析,使用iso-8859-1,中文会有乱码,所以
我们需要提前设置编码格式为utf-8.
2、response输出流中文乱码
response.setContentType("text/html;charset=UTF-8");
设置响应内容的格式,如果不设置为utf-8,默认使用的是iso-8859-1,浏览器对于中文会有乱码
3、HttpServletRequest和ServletRequest的关系
1、他们都是接口
2、HttpServletRequest继承了ServletRequest;
3、HttpServletRequest比ServletRequest多了一些针对于Http协议的方法