一、Servlet概述
Servlet 是Java Server Applet的简称,称为小服务器程序,用Java编写的服务器端程序,主要功能交互式地浏览和修改数据,生成动态Web内容。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet编程需要使用到javax.servlet 和 javax.servlet.http两个包下面的类和接口,在所有的类和接口中,javax.servlet.Servlet 接口最为重要。所有的servlet程序都必须实现该接口或者继承实现了该接口的类。javax.servlet.ServletConfig;
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
javax.servlet.http.HttpSession;
javax.servlet.http.Cookie
二、Servlet使用,两种方式
2.1 继承HttpServlet
GenericServlet抽象类,实现了 Servlet, ServletConfig, Serializable三个接口,使编写 servlet 变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 servlet,只需重写抽象service 方法即可。
HttpServlet类,是【继承GenericServlet的基础上进一步的扩展】,提供将要被子类化以创建适用于 Web 站点的 HTTP servlet 的抽象类。HttpServlet 的子类至少必须重写一个方法,该方法通常是以下这些方法之一:
doGet,如果 servlet 支持 HTTP GET 请求
doPost,用于 HTTP POST 请求
doPut,用于 HTTP PUT 请求
doDelete,用于 HTTP DELETE 请求
init 和 destroy,用于管理 servlet 的生命周期内保存的资源 ,当服务器关闭,执行destroy方法
getServletInfo,servlet 使用它提供有关其自身的信息
一般我们只需要重写doPost和doGet方法即可。
具体步骤
1. 新建servlet类,直接右键新建
2. 在doGet方法里面调用doPost方法
@WebServlet(name = "MyServlet",value = "myservlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在doGet方法里面调用doPost方法
doPost(request, response);
}
}
3. 设置编码
web开发出现乱码的问题主要是两个地方:一个是从浏览器表单中接收的数据,一个是服务器向浏览器发送的数据。
接收数据
接收数据使用的是【getParameter】方法,要在doPost方法内书写。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String request.getParameter(String var1); //var1是前端的变量名,或者表单的name, 返回的是value值
String[] getParameterValues(String var1); //返回的是数组,一般用于表单的多项选择,获取值
}
但是从前端获取的是utf-8编码的value,而服务器的request对象使用的是ISO8859-1(西欧编码集)这个字符编码来接收数据,浏览器和服务器沟通的编码不一致因此才会产生中文乱码的,所以使用【setCharacterEncoding】方法设置request编码
request.setCharacterEncoding("utf-8");
向浏览器响应数据
服务器向浏览器进行数据反馈响应,使用的是字节流和字符流的方法。
注意:字节流和字符流方法,只能二选一,不可同时用,一般传输音频、视频等需要字节流,文本使用字符流
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();//字符流
ServletOutputStream os = response.getOutputStream();//字节流
}
这样输出的结果是乱码,浏览器识别不到返回的中文是什么编码格式,就会默认使用GB2312,如果返回的是UTF-8格式的那么在浏览器上就会显示乱码的问题,问题出在浏览器上。需要使用【setContentType】方法设置response编码
//设置响应内容类型及编码,在响应报文中添加一个响应头 content-type:text/html;charset=utf-8
response.setContentType("text/html;charset=utf-8");
4. 给servlet配置url【核心】
必须配置servlet的url,用于html表单里面的【action】属性。
配置方式主要有两种:一种是注解,一种是配置WEB-INF下的【web.xml】文件
注解配置
注解类 【@WebServlet】,放到Servlet类的上面,主要属性:
name:serlvet名字 (可选)
value: 配置url路径,必须配置,value是数组,可以匹配多个url
urlPatterns:配置url路径 ,数组,可以匹配多个url,和value作用一样,不能同时使用
loadOnStartup:配置Servlet的创建的时机, 如果是0或者正数 启动程序时创建,如果是负数,则浏览器访问时创建,数子越小优先级越高,主要用于【init】方法
initParams:配置Servlet的初始化参数,可以在【init】方法中调取
Servlet中的url路径,共有四种方式:
注意有精确匹配优先精确匹配,否则模糊匹配
- 精确匹配:只有url路径是具体的名称的时候才会触发Servlet。
//必须有斜杠
@WebServlet(name = "MyServlet5",value = "/myservlet5")
- 模糊匹配——后缀匹配,只要是以某一后缀结尾的都可以运行
@WebServlet(name = "MyServlet4",urlPatterns