实际上servlet是一个类 本身jsp都要翻译成一个Java原文件,然后再编译成一个class文件,然后生成的结果再响应到客户端去 所以jsp页面本身就是一个类,它继承自servlet,则servlet类也就是一个Java的类
不会直接实现接口,而是继承已经实现类的接口 GenericServlet是通用类,他的子类HTTPServlet service?
注意是谁实例化,一般我们直接用即可 servlet容器有Tomcat,所以是Tomcatnew一个实例 注意init()和destroy()只会出现一次
继承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>
12345678910111213141516171819202122232425可以配置多个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只会出现一次
继承httpServlet类,必须要重写doXXX方法 service,是客户端判断了到底是get方法还是post方式请求,然后去调用doXXX方法
在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是网页输出,但是一般不需要这样做,因为跳转即可
举例 这两句效果一样
servlet的上下文就是应用程序application了
此时自动生成一个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); } }不加就显示警告,添加即可
为了避免乱码,写servlet时建议都写 ???待定
配置完,可以去获取这个值 使用servletConfig接口的getInitParameter()方法获取它的值 到所写的HelloServlet类里通过名字获取servlet初始化参数 然后在浏览器通过名字访问
1、定义一个上下文的参数,实际上是保存在application对象里面的