这里写目录标题
servlet需要掌握的
什么时候servlet
实际上servlet是一个类
本身jsp都要翻译成一个Java原文件,然后再编译成一个class文件,然后生成的结果再响应到客户端去
所以jsp页面本身就是一个类,它继承自servlet,则servlet类也就是一个Java的类
servlet体系结构
接口
不会直接实现接口,而是继承已经实现类的接口
GenericServlet是通用类,他的子类HTTPServlet
service?
servlet接口
ServletConfig
servlet生命周期
注意是谁实例化,一般我们直接用即可
servlet容器有Tomcat,所以是Tomcatnew一个实例
注意init()和destroy()只会出现一次
代码操作继承GenericServlet类
继承GenericServlet类,在Java Resource-src下面创建一个MyServlet类,继承GenericServlet类
加上初始化和销毁的方法
package test01;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet extends GenericServlet {
//添加一个构造方法
public MyServlet() {
System.out.println("constructor");
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//如果service方法被调用,就会输出service
System.out.println("service");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
然后再去配置下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>test01</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>
<!-- name和class必写,而且顺序name要在前面,名字可以任写,但是建议是要对应的类名 -->
<servlet-name>MyServlet</servlet-name>
<!-- 要完整的类名+包名 -->
<servlet-class>test01.MyServlet</servlet-class>
</servlet>
<!-- mapping就是映射,里面的name和class也是必写 -->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<!-- 虚拟路径,随便写 -->
<url-pattern>/xxx/hhh</url-pattern>
</servlet-mapping>
</web-app>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
可以配置多个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>test01</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>
<!-- name和class必写,而且顺序name要在前面,名字可以任写,但是建议是要对应的类名 -->
<servlet-name>MyServlet</servlet-name>
<!-- 要完整的类名+包名 -->
<servlet-class>test01.MyServlet</servlet-class>
</servlet>
<!-- mapping就是映射,里面的name和class也是必写 -->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<!-- 虚拟路径,随便写 -->
<url-pattern>/xxx/hhh</url-pattern>
</servlet-mapping>
<servlet>
<!-- name和class必写,而且顺序name要在前面,名字可以任写,但是建议是要对应的类名 -->
<servlet-name>MyHttpServlet</servlet-name>
<!-- 要完整的类名+包名 -->
<servlet-class>test01.MyHttpServlet</servlet-class>
</servlet>
<!-- mapping就是映射,里面的name和class也是必写 -->
<servlet-mapping>
<servlet-name>MyHttpServlet</servlet-name>
<!-- 虚拟路径,随便写 -->
<url-pattern>/MyHttpServlet</url-pattern>
</servlet-mapping>
</web-app>
然后去浏览器输入虚拟地址,但是浏览器空白,因为没有写out ,但是控制台有
浏览器每刷新一次,都输出service,但是init和destory只会出现一次
servlet类
GenericServlet抽象类
HttpServlet抽象类
继承httpServlet类,必须要重写doXXX方法
service,是客户端判断了到底是get方法还是post方式请求,然后去调用doXXX方法
servletRequest接口
servletResponse接口
在servlet里如果获得out这个内置对象
package test01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class MyHttpServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//out
PrintWriter out=response.getWriter();
out.print("<h1>MyHTTPServlet</h1>");
}
}
out是网页输出,但是一般不需要这样做,因为跳转即可
HttpServletRequest接口
举例
这两句效果一样
servletConfig接口
servlet的上下文就是应用程序application了
如何快捷新建一个servlet类
此时自动生成一个servlet类
package test01;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet")//这是注解,有了注解就不要写配置文件(就是web.xml文件),否则会报错,("/TestServlet")里面可改成xxx/aaa
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//可在这里写代码
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package test01; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/TestServlet") public class TestServlet extends HttpServlet { //这是版本号的序列id,不写也不回报错,但是会警告,建议加上 private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("<h1>xxxxxx</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
不加就显示警告,添加即可
ServletContext接口
如何使用servlet类实现登陆成功(代码操作)
为了避免乱码,写servlet时建议都写
???待定获取servlet初始化参数
配置完,可以去获取这个值
使用servletConfig接口的getInitParameter()方法获取它的值
到所写的HelloServlet类里通过名字获取servlet初始化参数
然后在浏览器通过名字访问定义全局配置
1、定义一个上下文的参数,实际上是保存在application对象里面的
总结servlet