创建一个servlet:
Servlet是一个接口。
工程名称:lianxiJavaWeb2
1.创建HelloServlet 名字的Java类
2.写web.xml映射文件
3.执行http://localhost:8080/lianxiJavaWeb2/hello
package servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//创建servlet接口的实现类
public class HelloServletimplements Servlet{
public HelloServlet(){
System.out.println("HelloServlet conjstractor...");
}
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0)throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("service");
}
}
Web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 配置映射Servlet -->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>//启动时创建servlet实例调用init方法
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>//映射的具体访问路径
</servlet-mapping>
</web-app>
/hello /:表示当前web应用的根目录也就是http://localhost:8080/lianxiJavaWeb2/;hello
Servlet容器:运行servlet,jsp,filter等软件环境。
1.可以创建servlet、并调用servlet的相关生命周期方法。
2.调用Jsp,filter listener,tag。。。。
Servlet生命周期的方法:以下方法都是由servklet容器负责调用
1.4个生命周期相关方法:1构造器(创建实例):第一次请求servlet时,创建servlet实例,调用构造器。这说明servlet是单实例的。只被调用1次
2.init方法:只被调用1次,在创建好实例后立即被调用,用于调用初始化servlet
3.Service:每次请求都会调用servlet方法,实际用于响应请求的。被调用多次。
Destroy:只被调用1次在当前servlet所在的web应用被卸载钱调用,用于释放当前servlet所占用的资源。
创建一个servlet:
Servlet是一个接口。
工程名称:lianxiJavaWeb2
1.创建HelloServlet 名字的Java类
2.写web.xml映射文件
3.执行http://localhost:8080/lianxiJavaWeb2/hello
package servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//创建servlet接口的实现类
public class HelloServletimplements Servlet{
public HelloServlet(){
System.out.println("HelloServlet conjstractor...");
}
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0)throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("service");
}
}
Web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 配置映射Servlet -->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>//启动时创建servlet实例调用init方法
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>//映射的具体访问路径
</servlet-mapping>
</web-app>
/hello /:表示当前web应用的根目录也就是http://localhost:8080/lianxiJavaWeb2/;hello
Servlet容器:运行servlet,jsp,filter等软件环境。
1.可以创建servlet、并调用servlet的相关生命周期方法。
2.调用Jsp,filter listener,tag。。。。
Servlet生命周期的方法:以下方法都是由servklet容器负责调用
1.4个生命周期相关方法:1构造器(创建实例):第一次请求servlet时,创建servlet实例,调用构造器。这说明servlet是单实例的。只被调用1次
2.init方法:只被调用1次,在创建好实例后立即被调用,用于调用初始化servlet
3.Service:每次请求都会调用servlet方法,实际用于响应请求的。被调用多次。
Destroy:只被调用1次在当前servlet所在的web应用被卸载钱调用,用于释放当前servlet所占用的资源。
2.Load-on-startup:可以指定servlet被调用的时机。0、1、2、3、4、5 越小越被启动。
配置在servlet节点中 若为负数,在第一次请求时被创建 若为0或整数,则在当前web应用被servlet容器加载时创建实例,数值越小越早被创建。
Servlet url映射可以使用通配符:/*;*.html;*.do;*.action
既带/又带扩展名的不合法。
servletConfig:
封装了Servlet配置信息,并且可以获取servletContext 对象;
配置servlet的初始化参数:必须在load-on-startup前面
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
<!-- 配置servlet初始化参数 -->
<init-param><!--局部的初始化参数-->
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
1.获取初始化参数:getInitParameter(String name):获取指定参数的初始化参数
2.getInitParameterNames() :获取参数名组成的Enumeration 对象。
获取servlet的配置名称:servletConfig.getServletName();
servletContext:servlet为每个web应用程序创建一个对应的servletContext对象,servletContext对象包含在servletConfig对象中,调用servletConfig.getServletContext方法可以返回ServletContext对象的引用。由于一个web应用程序中的所有Servlet都共有一个ServletContext对象,所以servletContext被称之为application 对象(Web应用程序对象)
1,可以由servletConfig获取
2.该对象代表当前web应用:可以认为servletContext是当前web应用的大管家,可以从中获取到当前web应用的各方面信息。
获取当前web应用的初始化参数:
<!-- 配置当前web应用的初始化参数 -->全局初始化参数
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
ServletContext context = servletConfig.getServletContext();
String driver = context.getInitParameter("driver");
Enumeration<String> names = context.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
}
1)获取当前Web应用的某一个文件在服务器上的绝对路径: 而不是部署前的路径。
String realpath = context.getRealPath("/index.jsp");
2)获取当前web应用的名称:
String contextPath = context.getContextPath();/lianxiJavaWeb
3)获取当前web应用的某个文件对应的输入流。
getResourceAsStream(String path):path的/为当前web应用的根目录。
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
InputStream is2 = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
和Attribute相关方法:
HTTP:
GET请求和POST请求:
如何在Servlet中获取请求信息:
1.Servlet的service()方法
public void service(ServletRequest arg0, ServletResponse arg1)
2. throws ServletException, IOException {}
3.ServletRequest:封装了请求信息,可以从中获取任何的请求信息。
4.ServletResponse:封装了响应信息如果想给用户什么响应,具体可以使用该接口进行实现。
5.这2个接口的实现类都是服务器给予实现的,并在服务器调用service方法是传入。
6.ServletRequest:
7.String getParameter(String name):根据参数名,返回参数值
8.Map getParameterMap() ;
9.Enumeration getParameterNames();根据请求参数的名字,返回请求参数对应的字符串数组。返回参数名对应的Enumeration对象,类似于ServletConfig的getInitParameterNames();
10.String[] getParameterValues(String name)返回请求参数的键值对key:参数名,value:参数值String数组类型。
用于获取checkbox这样类型的值
请求URI获取:
HttpServletRequest httpServletRequest =(HttpServletRequest) request;
String requestURI = httpServletRequest.getRequestURI();
String method = httpServletRequest.getMethod();
HttpServletRequest:是ServletRequest的子接口,针对于Http请求所定义。里面包含了大量获取Http请求相关的方法。
ServletResponse:
ServletResponse:封装了响应信息,如果想给用户什么信息,具体可以使用该接口实现。
getWriter():返回PrintWriter对象,将把print()中的参数直接打印到客户的浏览器上。
response.setContentType("application/msword");设置响应类型.
Void sendRedirect(String location) :请求的重定向。(此方法为HttpServletResponse中定义)。
GenericServlet:是Servlet和ServletConfig接口的实现类。,但是是一个抽象类方法。、存在意义:如果新建的servlet程序直接继承GenericServlet,会使开发更简洁。
具体实现:
在GenericServlet中声明一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化,利用servletConfig成员变量的方法实现了ServletConfig接口的方法;还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化;不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),而还是用了ServletConfig接口的方法,就会出现空指针异常;新建的init()并非servlet的声明周期方法,是init(ServletConfig)是声明周期相关的方法。
子类:
public class LoginServletextends MyGenericServlet{
public void init(ServletConfig arg0)throws ServletException{
//对当前的Servlet进行初始化。覆盖了MyGenericServlet的init()方法。
super.init(arg0);
System.out.println("初始化。。");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
}
}
public abstract class MyGenericServlet implements Servlet,ServletConfig {
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
private ServletConfigservletConfig;
@Override
public void init(ServletConfig arg0)throws ServletException {
servletConfig = arg0;
}
@Override
public abstract void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException ;
@Override
public String getInitParameter(String arg0) {
return servletConfig.getInitParameter(arg0);
}
@Override
public Enumeration<String> getInitParameterNames() {
// TODO Auto-generated method stub
return servletConfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub
return servletConfig.getServletContext();
}
@Override
public String getServletName() {
// TODO Auto-generated method stub
return servletConfig.getServletName();
}
}
HttpServlet:
实际开发中,继承 HttpServlet 覆盖doPost()方法;直接使用HttpSerlvetRequest和HttpSerlvetResponse。
/**
* 针对于Http协议定义的一个Servlet基类
* @author Administrator
*
*/
public class MyHttpServletRequestextends MyGenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
//Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例
if(arg0 instanceof HttpServletRequest){
HttpServletRequest request = (HttpServletRequest)arg0;
if(arg1 instanceof HttpServletResponse){
HttpServletResponse response = (HttpServletResponse)arg1;
service(request,response);
}
}
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取请求方式
String method = request.getMethod();
//2.根据请求方式调用对应方法
if("GET".equalsIgnoreCase(method)){
doGet(request,response);
}
if("POST".equalsIgnoreCase(method)){
doPost(request,response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// TODO Auto-generated method stub
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
// TODO Auto-generated method stub
}
}