Servlet初识
简介
Servlet 小服务程序
是个java类 是个接口
注意:在浏览器*问的每一个网页都是一个servlet
每个servlet都需要配置一个网址 在web.xml中配置
apache-tomcat-9.0.0.M26
需要先下载apache-tomcat-9.0.0.M26压缩包,然后解压,解压后的文件如下图所示
tomcat文件夹下:
bin: 可执行的文件(打开关闭服务器的文件)
conf: 服务器的配置信息(文件夹)
lib: 服务器使用的jar包
logs: 服务器日志
temp: 产生临时文件
work: 服务器自己的工作空间
webapps: 默认的存放工程(应用程序)文件夹
wtpwebapps: 跟Eclipse关联后产生的存放工程的文件夹
控制台启动Tomcat
从控制台启动Tomcat服务器命令
1.先去Tomcat服务器下面的bin文件夹
cd 文件夹路径
2.获取文件夹权限(读写)
sudo chmod 755 *.sh
输入密码
3.执行打开服务器
sudo sh ./startup.sh
4.访问服务器网址
url:全球统一资源定位符
http://localhost:8080
协议://本地地址:端口号/项目名(应用程序名)/访问的资源
http://localhost:8080/sh-web-servlet01/1.html
5.执行关闭服务器
sudo sh ./shutdown.sh
注意清空Log文件中的日志
从浏览器访问到Servlet类
1.用户用网址访问服务器(tomcat)
2.服务器通过网址找到对应项目的web.xml文件
3.通过网址找到对应的servletname
4.通过servletname找到对应的servlet类
5.创建servlet对象
6.执行声明周期的几个方法
实例化-->初始化-->service服务-->销毁
实例化方法(无参构造方法)
public Demo01(){
System.out.println("我是实例化方法");
}
初始化方法
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("初始化方法init");
}
service服务
servlet只创建了一个 多次访问 实际上就是 多次调用服务的方法
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("我是服务方法的service");
}
销毁方法
1.删除该应用程序调用
2.停止服务器
@Override
public void destroy() {
System.out.println("我是销毁方法destroy");
}
创建servlet方式一
使用implements关键字 实现Servlet接口,同时需要实现里面的抽象方法
public class Demo01 implements Servlet{
public Demo01() {
System.out.println("我是实例化方法");
}
@Override
public void init(ServletConfig arg0) throws ServletException{
System.out.println("初始化方法init");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("我是服务方法的service");
}
@Override
public void destroy() {
System.out.println("我是销毁方法destroy");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
创建servlet方式二
适配器模式创建:使用哪个方法就重写哪个方法 用不上的方法可以不重写
使用extends关键字 继承 GenericServlet类,打开GenericServlet类,看里面的介绍
发现GenericServlet类实现了Servlet类,代码为:
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{}
可见Servlet类是基础类,GenericServlet通过实现Servlet类,再让我们继承它这个类
可以方便我们写代码
public class Demo02 extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("我是demo02");
}
}
创建servlet方式三(常用的方式,必会的)
使用extends关键字,继承HttpServlet类,打开HttpServlet类,看里面的介绍发现HttpServlet继承
了GenericServlet类,代码为:
public abstract class HttpServlet extends GenericServlet{}
可见HttpServlet继承了GenericServlet类,而GenericServlet类又继承了Servlet接口,底层的
两个类都
实现了Servlet接口中的方法,我们可以用通过实现Servlet接口来创建Servlet,也可以通过继承GenericServlet和HttpServlet类
来创建servlet
public class Demo03 extends HttpServlet{}
获取servlet中的配置信息
1.声明一个ServletConfig当做成员变量
2.重写初始化方法init
通过该方法的参数 获取ServletConfig对象
ServletConfig对象中保存的是servlet中的配置信息
3.重写doGet方法和doPost方法接收Get请求和Post请求
注意:重写doGet和doPost方法时,里面会有方法super.doGet(),super.doPost()
HttpServlet中的两个方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
不管子类中怎么调用这两个方法,都会报错
要么报SC_METHOD_NOT_ALLOWED(404) 要么报SC_BAD_REQUEST(405)
重写完这两个方法后,注意不要调用父类的doGet方法:super.doGet(rep,resp)
servletConfig获取方式一
public class Demo03 extends HttpServlet{
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
传入参数 配置时的 name(相当于key)
用key获取对应的value
String value = this.config.getInitParameter("encoding");
System.out.println(value);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
servletConfig获取方式二
通过父类中的方法获取配置信息(获取ServletRequest对象)
public class Demo04 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String config = this.getServletConfig().getInitParameter("encoding");
System.out.println(config);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
域对象
在一定范围内 存储信息的对象
ServletContext范围 是整个程序中 都可以访问到 并且都只有一个 单例对象
每个Servlet都可以访问到这个域对象
获取ServletContext对象
方式1:从ServletConfit对象中获取
方式2:从父类中直接获取
注意:所有的域对象 都有设置/获取/删除的方法
设置域对象属性
public class Demo05 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext application = this.getServletConfig().getServletContext();
application.setAttribute("username", "wanglong");
}
}
获取域对象属性
public class Demo06 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = this.getServletContext().getAttribute("username");
System.out.println(attribute);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>sh-web-servlet01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>com.lanou3g.Demo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo02</servlet-name>
<servlet-class>com.lanou3g.Demo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo02</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo03</servlet-name>
<servlet-class>com.lanou3g.Demo03</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>demo03</servlet-name>
<url-pattern>/demo03</url-pattern>
</servlet-mapping>
</web-app>
总结
获取servletConfig对象的方式有两种,获取属性值的方式为getinitparameter("属性名")
获取servletContext域对象 可以通过 this.getServletConfig.getServletContext()获取,再通过.getInitParameter("属性名")
来获取web-xml中配置的属性的值
也可以直接通过this.getServletContext()来获取servletContext()域对象,再通过.getInitParameter("属性名")来获取属性值
在获取ServletContext对象之后,如果使用context.getAttribute("属性名")来获取web-xml中设置的属性值,会得到空值null,
要想使用getAttribute方法得到的不是空值,必须先使用setAttribute("属性名","属性值")来设置属性,然后才可以使用getAttribute方法
setAttribute("属性名","属性值")方法与getAttribute("属性名")方法一般成对使用,不要随意的使用getAttribute()方法
用this.getservletconfig().getInitParameter("属性名")获取属性值,如果属性名位context-param中的内容,获取的值为null