文章目录
一、Servlet的简介
Servlet ===>server applet
java服务器的小程序,是javaweb非常重要的环节。主要作用是完成html和java后台代码的交互(请求 《=》响应)
servlet是需要运行在Java服务器(Tomcat)中的,符合http协议的servlet的核心类接口的
javax.servlet和javax.servlet.http
javax.servlet.ServerException
javax.servlet.http.HttpServlet
javax.servlet.http.HttpServletRequest
javax.servlet.http.HttpServletResponse
javax.servlet.http.Session
javax.servlet.http.Cookie
二、Servlet的入门案例
代码如下(示例):
package com.qfedu.a_servelt;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @WebServlet(name = "HelloServlet")
*
* 告诉服务器这个是我的servlet
* @webServlet 是我们请求servlet的入口
* 把name去掉 然后加一个斜线,如果这个斜线没有带会报错 404
* 请求这个servlet这个资源的时候
* url : http://localhost:8080/day39_xkh/HelloServlet
* */
@WebServlet("/HelloServlet")//这个是注解,是修饰下面的HelloServlet
//如果想要初始化这个类,必须写这个入口
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//我不管你的请求方式是get还是post请求
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置网页字符编码集
response.setContentType("text/html;charset=utf-8");
//请求和响应PrintWriter 打印写入 这种写法会在浏览器中显示出来
response.getWriter().append("我的第一个web程序");
System.out.println("hello,world");
}
}
结果如下(示例):
红色的是日志信息
三、创建Servlet的三种方式
①实现Servlet接口的方式
① 返回值:void 方法名: init(ServletConfig servletConfig)throws ServletException : 使用ServletConfig对象初始化我们的Servlet ,这个方法执行
②返回值:ServletConfig 方法名: getServletConfig() :获取配置信息对象的方法,这个方法不执行
③void service(ServletRequest servletRequest,ServletResponse servletResponse) throws ServletException,IOException :核心方法,这个里面类似于我们的doget方法和dopost方法,这个方法一定执行
④String getServlrtInfo() :获取Servlet详细信息的方法,不执行
⑤void destory() : 在tomcat关闭的时候,进行销毁这个servlet,只有在tomcat关闭的时候执行
init(ServletConfig servletConfig)throws ServletException : 使用ServletConfig对象初始化我们的Servlet ,这个方法执行
getServletConfig() :获取配置信息对象的方法,这个方法不执行
service(ServletRequest servletRequest,ServletResponse servletResponse) throws ServletException,IOException :核心方法,这个里面类似于我们的doget方法和dopost方法,这个方法一定执行
getServlrtInfo() :获取Servlet详细信息的方法,不执行
destory() : 在tomcat关闭的时候,进行销毁这个servlet,只有在tomcat关闭的时候执行
②继承GenericServlet抽象类
service(ServletRequest servletRequest,ServletReponse servletresponse)throws ServletException,IOException
③继承HttpServlet抽象类
3.1实现Servlet接口的方式
代码如下(示例):
package com.qfedu.a_servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/test1")
public class Servlet1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//s使用ServletConfig对象初始化我们的Servlet
//执行了,从这个地方可以说明一个问题 Servlet已经被实例化了
System.out.println("init方法执行");
}
@Override
public ServletConfig getServletConfig() {
//获取servlet配置信息对象
//没有执行
System.out.println("getServletConfig方法执行");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//核心方法 类似于我们的doGet()方法,和doPost()方法 请求和响应
//一定执行的
System.out.println("service");
}
@Override
public String getServletInfo() {
//获取Servlet的详细信息
//没有执行
System.out.println("getServletInfo方法执行");
return null;
}
@Override
public void destroy() {
//当tomcat关闭的时候,执行销毁这个servlet的方法
System.out.println("destroy方法执行");
//只有当tomcat关闭的时候,才会执行这个方法
}
}
结果如下(示例):
3.2继承GenericServlet抽象类的方式
代码如下(示例):
package com.qfedu.a_servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/*
* 第二种方式:继承GenericServlet
*
* */
@WebServlet("/test2")
public class Servlet2 extends GenericServlet {
//只有一个方法是必须重写的,抽象方法
//为什么?service是核心方法,因为请求和响应就是执行这个方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解决中文乱码问题
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是第二种创建Servlet的方法");
}
}
结果如下(示例):
3.3继承HttpServlet的方式
代码如下(示例):
package com.qfedu.a_servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test3")
public class Servlet3 extends HttpServlet {
//因为在前端的时候,有两种请求方式get和post
//doGet和doPost方法写在了Service方法中了
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("我是HttpServlet创建的Servlet");
}
}
结果如下(示例):
这三个创建方式选择哪个?
最好的方式是继承HttpServlet
1.可以减少对其他方法的要求 init destroy
2.可以根据前端的要求进行分门别类 doGet doPost
四、Servlet注解和配置文件的写法
1.上面采用的都是注解的写法,对Servlet的版本有要求,servlet3.0及以上的版本才可以使用注解
2.还有一种写法是配置文件的写法。对文件没有要求
4.1配置文件的写法
① 需要在web.xml文件写配置
web.xml文件代码如下
代码如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- servlet配置文件的写法-->
<servlet>
<display-name>WebXMLServlet</display-name>
<!-- servlet-name要和servlet-mapping所对应,映射的关系-->
<servlet-name>WebXMLServlet</servlet-name>
<!-- servlet-class 是servlet所对应的类-->
<servlet-class>com.qfedu.b_servlet.WebXMLServlet</servlet-class>
<!-- 只要tomcat服务器一启动就会加载这个类-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WebXMLServlet</servlet-name>
<url-pattern>/Webxml.do</url-pattern>
</servlet-mapping>
</web-app>
java代码:
代码如下(示例):
package com.qfedu.b_servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class WebXMLServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置网页的编码格式
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("我这个是配置文件的写法");
}
}
结果如下(示例):
4.2注解的写法
代码如下(示例):
package com.qfedu.b_servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* name是Servlet的名字 对应配置文件中的servlet-name
* value 是servlet程序对应的url 只能写一个
* loadOnStartup tomcat启动的时候会不会自动加载这个servlet类
* 默认为 -1 (不加载) 1(自动加载)
* urlPatterns对应配置文件中的url-pattern 可以写多个url,都可以访问
*
* */
@WebServlet(name = "AnnotionServlet",urlPatterns = {
"/as","/as.do","/as.action"},loadOnStartup = 1)
public class AnnotionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这个是注解的写法");
//设置网页的编码格式
response.setContentType("text/html;charset=utf-8");
response.getWriter().