续Servlet基础1 https://blog.csdn.net/qq_42980244/article/details/96827153
3.第二次Servlet :认识ServletConfig对象
3.1实现Servlet接口后,有一个getServletConfig()方法,返回值为ServletConfig
3.2ServletConfig作用:获取Servelt的初始化参数
在web.xml中的Servlet节点下加入以下代码
<!-- 属于这个servlet的初始化参数 -->
<init-param>
<param-name>username</param-name>
<param-value>小明</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</init-param>
3.3如何获得ServletConfig?
定义一个私有的成员变量config,把init()方法中的ServlerConfig对象传给成员变量,再在getServletConfig()方法中获取config对象
/**
* 获取ServletConfig配置信息
*/
public class SeServlet implements Servlet{
//定义一个成员变量,把init()里面的config传到getServeltCconfig方法中返回
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
this.config=config;
System.out.println("我出生啦");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("我被调用啦");
//获取所有键的集合
Enumeration<String> names = getServletConfig().getInitParameterNames();
//遍历枚举,可以获取所有的键的值
while(names.hasMoreElements()) {
String name = names.nextElement();
String val = getServletConfig().getInitParameter(name);
System.out.println(name+"--"+val);
}
String servletName = getServletConfig().getServletName();
System.out.println(servletName);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("我要死了");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return this.config;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return "";
}
}
3.4servletConfig的几个方法:
getInitParameter()
getInitParameterNames()
getServletContext()
getServletName()
4.认识ServletContext对象
4.1ServlertContext引入
Servletconfig有一个方法getServlerContext(),ServlertContext是Servlet的四大域对象之一,它与服务器同生共死,服务器启动时,ServlertContext被创建,服务器停止时ServlertContext被销毁
4.2ServletContext对象
一个web项目 对应一个web.xml
web.xml中可以有多个Servlet,ServletContext对象被所有servlet共享
而ServletConfig是某个Servlet的配置。
所以在web.xml中<context-param>写在根目录下,(也就是<Servlet>的外面)
而<init-param>写在<Servlet>里面的原因。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>暑假复习</param-name>
<param-value>Servlet</param-value>
</context-param>
<context-param>
<param-name>year</param-name>
<param-value>2019/7</param-value>
</context-param>
<!-- 配置CServlet -->
<servlet>
<!-- 配置servlet的名字 -->
<servlet-name>login</servlet-name>
<!-- 这个servlet的全类名 全限定名 -->
<servlet-class>com.a_firstServlet.CServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/c</url-pattern>
</servlet-mapping>
<!-- 配置BServlet -->
<servlet>
<!-- 配置servlet的名字 -->
<servlet-name>login</servlet-name>
<!-- 这个servlet的全类名 全限定名 -->
<servlet-class>com.a_firstServlet.BServlet</servlet-class>
<!-- 属于这个BServlet的初始化参数 -->
<init-param>
<param-name>username</param-name>
<param-value>小明</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
CServlet.Java代码片段
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servletContext = getServletConfig().getServletContext();
String a = servletContext.getInitParameter("暑假复习");
String b = servletContext.getInitParameter("year");
System.out.println(a+" "+b);
}
4.3访问
http://localhost:8809/SummerWeb/c 可以访问到<context-param>
http://localhost:8809/SummerWeb/b 也可以访问到<context-param>,还可以访问到<init-param>
4.4ServletContext对象的几个常用方法
getAttribute()
setAttribute()
removeAttribute()
getContextPath() 获取项目相对路径
getRealPath() 获取项目绝对路径
ServletContext servletContext = getServletConfig().getServletContext();
String path = servletContext.getContextPath();
String realpath= servletContext.getRealPath("");
System.out.println(path+" "+realpath);
结果:/SummerWeb E:\apache-tomcat-9.0.14\webapps\SummerWeb\
5.实现Servlet的第二种方式--继承GenericServlet类
genericServlet实现了Servlet接口,ServletConfig接口,可以直接拿到ServletContext对象
继承GenericServlet只需要实现他的service()方法,可查看源码
GenericServlet源码中,在service()中判断请求类型,调用对应的方法
package com.b_secondServlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AGenerServlet extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
6.实现Servlet的第三种方式--继承HttpServlet类
HttpServlet继承了GenericServlet,genericServlet能做的,HttpServlet也能做
继承了HttpServlet类,不用实现他的任何方法
只需要写doget()和dopost()
6.1
写一个html页面
<body>
111111
<form action="httpa" method="post">
<button>提交</button>
</form>
</body>
public class AHttpServler extends HttpServlet{
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get");
}
}
在浏览器中访问该html页面,405,提交方式不正确
再将method改为get则可以访问
或者在 AHttpServler中添加dopost()方法
7.在web project 中直接新建一个Servlet
在此之前,我们创建的是class,web.xml需要自己编写,现在新建一个Servlet,web.Xml会自动帮我们生成。
Sevlet基础3 https://blog.csdn.net/qq_42980244/article/details/97019665