Web资源
- 在http协议当中,规定了请求和响应双方,客户端和服务器端。与web相关的资源,有两种分类
- 静态资源 html、css、js
- 动态资源 servlet/jsp
Servlet
- 其实就是一个java程序,运行在我们的web服务器上,用于接受和响应客户端的http请求
- 更多的是配合动态资源来做。当然静态资源也需要使用到servlet,只不过tomcat里面已经定义好了一个DeafaultServlet
入门实现HelloServlet
- 写一个Web工程,要有一个服务器tomcat
- 运行测试Web工程
- 新建一个类,实现Servlet接口
- 配置Servlet 用意:告诉服务器,我们的应用有这么写个servlet
<?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>HelloWeb0</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>
<!-- 向tomcat报告,我这个应该里有这个servlet,名字叫做HelloServlet,具体的路径是/HelloWeb/src/servlet/HelloServlet.java -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<!-- 注册servlet的映射。selvletName:找到上面注册的具体的servlet,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
</web-app>
package servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("HelloServlet.....");
}
}
执行过程
Servlet的通用写法
Servlet(接口)-------GenericServlet---------HttpServlet(用于处理http的请求)
定义一个类,继承HttpServlet,复写doGet和doPost
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet02 extends HttpServlet{
//Get请求会来这个方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
System.out.println("Get.....");
}
//Post请求回来这个方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
System.out.println("Post.....");
}
}
生命周期
- 从创建到销毁的一段时间
生命周期方法
- 从创建到销毁所调用的方法 3个看代码
package servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet03 implements Servlet{
//1.在创建该servlrt的实例时,就执行该方法
//一个servlet只会初始化一次,init方法只会执行一次
//默认情况下是,初次访问该servlet,才会创建实例
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("HelloServlet03初始化.......");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
//2
//只要客户端来了一个请求,就执行该方法
//该方法一次请求执行一次
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("HelloServlet03 service....");
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
//3.servlet销毁的时候,就会执行该方法
/*
* 1.该项目从tomcat移除
* 2.正常关闭tomcat就会执行 shutdown.bat
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("HelloServlet03 destory....");
}
}
doGet和doPost 不算生命周期方法。所谓的生命周期是指,从对象的创建到销毁一定会执行的方法,但是这两个方法不一定会执行。
Servlet创建实例提前
- 默认情况下,只要在初次访问servlrt的时候,才会执行init方法。
- 那么这个时候初次访问,可能会在init中逗留太多时间
- 解决:在配置的时候,使用load-on-startup元素来指定,给指定的数字越小,启动越早。一般不写负数,从2开始
ServletConfig
通过这个对象,可以获取servlet在配置的时候的一些信息
package servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServletConfig extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletConfig 可以获取servlet在配置的一些信息
//得到servlet配置对象,专门用于在配置servlet的信息
ServletConfig config=getServletConfig();
//获取的是配置servlet里面servlet-name的文本内容
String servletName=config.getServletName();
System.out.println("servletName="+servletName);
String address=config.getInitParameter("address");
System.out.println("address="+address);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
为什么需要有这个????
- 加入我们自己开发的一些应用,要使用到了一些技术,或者一些代码,我们不会。但是有人写出来,他的代码放在了自己的servlrt类里面。
- 刚好这个servlet里面需要一个数字或者叫做变量值,但是这个值不能是固定了。所以要求使用到这个servlei的公式,在注册servlet的时候,必须在web.xml里面声明init-params