Servlet
传统的Java代码无法获取请求参数,只有使用Java程序中的Servlet技术才可以获取,但是需要服务器编译环境的支持;
Servlet就是一个Java程序,一个Java类;可以和浏览器进行交互,是一个动态资源;Servlet的使用需要有服务器编译环境的支持需要导入Servlet的API;
1.服务器编译环境
Extenal Libaries中必须要有服务器的jar包,如下图:
当前工程配置web服务器的编译环境:
- 在项目名称上右键选择Open Module Settings
- 点击Dependencise
- 点击右边的加号,选择Library
- 点击Java选择你的服务器
- 应用
2. Servlet的入门案例
- 自定义Servlet继承HttpServle
- 重写doGet方法和doPost方法
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//1.自定义类继承HttpServlet
public class Servlet extends HttpServlet {
//2.重写doGet和doPost方法
//在doget中调用doPost方法
//处理get请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet doGet");
}
//处理post请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在web.xml配置servle
声明自定义Servlet
给自定义Servlet配置访问名称
<!--3.配置Servlet-->
<!--声明Servlet-->
<servlet>
<!--servlet的名称-->
<servlet-name>Servlet</servlet-name>
<!--servlet的全类名-->
<servlet-class>com.kaka.servlet.Servlet</servlet-class>
</servlet>
<!--
给Servlet设置访问名称
-->
<servlet-mapping>
<!--servlet的名称-->
<servlet-name>Servlet</servlet-name>
<!--servlet的访问名称-->
<url-pattern>/Demo01</url-pattern>
</servlet-mapping>
打印输出Servlet doGet
3. Servlet的执行流程
HttpServlet继承于GenericServlet、GenericServlet实现于Servlet,也就是说Servlet是顶层接口;
在Servlet接口中定义了一个方法service,它的主要作用是处理来自浏览器的请求操作。在service方法的重载的方法中,对请求方式进行判断,如果是GET就会调用doGet方法,如果是POST就会调用doPost方法。
步骤如下:
浏览器发起请求: http://localhost:8080/day50/Demo01
在服务器中找访问名称为Demo01的Servlet -> Servlet
- 请求的处理就交给了Servlet的实例,根据请求方式get/post,决定是给doGet还是doPost方法
注意:
- 不管是get请求还是post请求,对于服务器来说是没差别的;
- get请求将请求参数放到请求网址;
- post请求将请求参数放到请求正文;
- 不管哪种方法服务器最终都是通过getParameter()方法来获取请求参数的;
4. 实现Servlet的三种方式
Servlet是一个运行在服务器上java动态资源。Sun对于servlet定义,就是一个javax.servlet.Servlet接口;
创建Servlet的三种方式:
方式一:实现Servlet接口
在servlet接口中,没有doGet和doPost方法,处理请求是service方法(抽象的),没有针对Http协议;
<servlet>
<servlet-name>TestServlet03</servlet-name>
<servlet-class>com.kaka.test_01.servlet.TestServlet03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet03</servlet-name>
<url-pattern>/Demo03</url-pattern>
</servlet-mapping>
public class TestServlet03 implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("实现Servlet接口");
//想要针对HTTP需要手动强转
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
方式二:继承GenericServlet类
在GenericServlet类中,没有doGet和doPost方法,处理请求是service方法(抽象的),没有针对Http协议;
<servlet>
<servlet-name>TestServlet02</servlet-name>
<servlet-class>com.kaka.test_01.servlet.TestServlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet02</servlet-name>
<url-pattern>Demo02</url-pattern>
</servlet-mapping>
public class TestServlet02 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("继承GenericServlet");
//想要针对HTTP需要手动强转
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
}
}
方式三:继承HttpServlet类
在HttpServlet中,重写GenricServlet类中的service方法,会由GenericServlet给service方法提供请求对象(ServletRequest)、响应对象(ServletResponse),不针对Http协议!!所以需要强转成HttpServletRequest、HttpServletResponse,之后调用另外一个service方法,传入HttpServletRequest、HttpServletResponse;
获取到请求方式,如果是get请求,就调用doGet方法,如果是post请求,就调用doPost方法;
在开发中,应用比较多的是使用extends HttpServlet,优点是它是与http协议相关的,封装了http协议相关的操作也就是针对http协议有优化,有针对Http协议;
<servlet>
<servlet-name>TestServlet01</servlet-name>
<servlet-class>com.kaka.test_01.servlet.TestServlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/Demo01</url-pattern>
</servlet-mapping>
public class TestServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("继承HTTPServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
将ServletRequest和ServletResponse分别强转为HttpServletRequest和HttpServletResponse,因为HttpServletRequest和HttpServletResponse有针对http协议做优化,ServletRequest和ServletResponse没有针对Http协议做优化无法专门针对http协议调用方法;