实现servlet接口并优化代码解读
3.2.1 方式一:直接实现类实现servlet接口,并全部重写servlet接口中的方法
实现类:
//Servlet 接口是用来获取浏览器请求(request)的数据,以及将处理完的数据响应(response)给浏览器
public class ServletDemo1 implements Servlet {
//第一次请求访问
public void init(ServletConfig servletConfig) throws ServletException { }
//处理请求数据(业务逻辑的处理);每当获取一个请求,返回一个响应信息
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("你好,servlet");
}
//关闭服务器,进行销毁
public void destroy() { }
public ServletConfig getServletConfig() { return null; }
public String getServletInfo() { return null; }
}
Web.xml配置文件:
<!--配置servlet具体信息-->
<servlet>
<!--注册的servlet的名称-->
<servlet-name>demo1</servlet-name>
<!--servlet实现类的文件路径 - 包名 + 类名-->
<!--配置servlet 包名 + 类名-->
<servlet-class>com.heima.cn.a_servlet.ServletDemo1</servlet-class>
</servlet>
<!--配置servlet映射路径-->
<servlet-mapping>
<!--获取注册的servlet名称-->
<servlet-name>demo1</servlet-name>
<!--访问的url地址,前面需要加 / -->
<!-- url地址 -> 协议(http(广泛的协议),https(更安全的协议),ftp(上传下载协议)) +
+ 域名(www.baidu.com or ip地址) +端口号(默认80.浏览器自动添加) + 资源位置(index.com) +
+ 键值对 (id = ?) -->
<!--组件的访问路径-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
浏览器访问:
3.2.2 方式二:GenericServlet优化方案
3.2.2.1 自己定义的GenericServlet优化实现
实现:
1.自定义抽象类GenericServlet实现servlet接口,获取servlet所有方法,并将service()方法定义为抽象方法
2.自定义servletdemo类继承抽象类GenericServlet,实现并重写service方法
实现类
public abstract class GenericServletDemo1 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException { }
public ServletConfig getServletConfig() { return null; }
//抽象方法定义格式
// void destroy();
//抽象方法 -- 修饰符 abstract 返回值类型 方法名 (参数列表);
public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException ;
//一般方法
public String getServletInfo() { return null; }
public void destroy() { }
}
继承类
public class ServletDemo2 extends GenericServletDemo1 {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("实现了servlet");
}
}
Web.XML配置文件
<!--配置servlet具体信息-->
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.heima.cn.a_servlet.ServletDemo2</servlet-class>
</servlet>
<!--配置servlet映射路径-->
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
结果
网页输入 控制台输出
3.2.2.2 系统定义的GenericServlet优化实现
实现类
public class ServletDemo3 extends GenericServlet {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("系统定义的servlet优化实现");
}
}
web.xml配置文件
<!--配置servlet具体信息-->
<servlet>
<servlet-name>demo3</servlet-name>
<servlet-class>com.heima.cn.a_servlet.ServletDemo3</servlet-class>
</servlet>
<!--配置servlet映射路径-->
<servlet-mapping>
<servlet-name>demo3</servlet-name>
<url-pattern>/demo3</url-pattern>
</servlet-mapping>
结果:
网页输入数据 控制台输出结果
3.2.3 方式三: HttpServlet 优化方案
实现 ---- 区分表单(from)中提交的方法(method= get or method = post)
1.自定义抽象类HttpServlet继承抽象类GenericServlet类,实现service方法
2.调用service方法,将参数类型(ServletRequest servletRequest, ServletResponse servletResponse)强转为HttpServletRequest(提供请求信息)和 HttpServletResponse(发送响应信息)接口
多态转换:Interface HttpServletRequest implements ServletRequest(接口)
3.调用HttpServletRequest接口中的public String getMethod()方法,用来区分表单提交的方法
4.判断表单提交方法类型,分别实现doGet()方法 和doPost()方法
5.自定义servlet类继承抽象类HttpServlet,调用并重写doGet()方法 和doPost()方法
6.注意点:表单当中的action参数需要和配置文件web.xml中url地址一致
<form action="/demo4" method="get" > 表单信息
<url-pattern>/demo4</url-pattern> 映射文件信息
抽象类
public abstract class HttpServlet extends GenericServlet(系统自定义优化实现) {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//Interface HttpServletRequest implements ServletRequest(接口) ---> 扩展 javax.servlet.ServletRequest 接口,为 HTTP servlet 提供请求信息。
多态强制转换类型,调用HttpServletRequest中的getmethod方法,获取发出请求的http方法名称(get或post)
HttpServletRequest request = (HttpServletRequest) servletRequest;
//Interface HttpServletResponse implements servletResponse(接口)--> 扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能
HttpServletResponse response = (HttpServletResponse) servletResponse;
service(request,response);
}
public void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//HttpServletRequest接口中的getmethod方法
// public String getMethod() --> 返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。
String req = request.getMethod();
if(req.equalsIgnoreCase("get")){
//System.out.println("get方法获取表单");
doGet(request,response);
}else if (req.equalsIgnoreCase("post")){
//System.out.println("post方法获取表单");
doPost(request,response);
}else {
System.out.println("servlet");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) { }
public void doGet(HttpServletRequest request, HttpServletResponse response) { }
}
实现类
public class ServletDemo4 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) {
//super.doPost(request, response);
System.out.println("获取post方法提交的表单");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// super.doGet(request, response);
System.out.println("获取get方法提交的表单");
}
}
index.html 表单信息
<body>
<form action="/demo4" method="get" > 跳转的url地址
<input type="submit" value="提交">
</form>
</body>
Web.xml 配置文件(servlet信息)
<!--配置servlet具体信息-->
<servlet>
<servlet-name>demo4</servlet-name>
<servlet-class>com.heima.cn.a_servlet.ServletDemo4</servlet-class>
</servlet>
<!--配置servlet映射路径-->
<servlet-mapping>
<servlet-name>demo4</servlet-name>
<url-pattern>/demo4</url-pattern> 表单的action
</servlet-mapping>
结果:
网页信息界面 控制台信息界面
系统定义的HttpServlet
自定义类
public class ServletDemo5 extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
System.out.println("这是系统的doGet方法");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/// super.doPost(req, resp);
System.out.println("这是系统的doPost方法");
}
}
配置文件web.xml
<!--配置servlet具体信息-->
<servlet>
<servlet-name>demo5</servlet-name>
<servlet-class>com.heima.cn.a_servlet.ServletDemo5</servlet-class>
</servlet>
<!--配置servlet映射路径-->
<servlet-mapping>
<servlet-name>demo5</servlet-name>
<url-pattern>/demo5</url-pattern>
</servlet-mapping>
表单信息
<body>
<form action="/demo5" method="get">
<input type="submit" value="注册">
</form>
</body>