一,Servlet简介
Java Servlet是与平台无关的服务器端组件,它运行在Servlet容器中(Tomcat服务器)。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
Servlet是一个接口。
二,一个简单的Servlet实例:
package com.Test;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println(" getServletInfo");
return null;
}
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init");
}
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
public HelloServlet(){
System.out.println("HelloServlet");
}
}
结果如下:
实现步骤:
①创建一个类实现Servlet接口
②在web.xml中配置和映射Servlet
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.Test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern> < ! -- / 代表当前应用的根目录>
</servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.Test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern> < ! -- / 代表当前应用的根目录>
</servlet-mapping>
三,生命周期和方法
Servlet容器(Tomcat服务器)自己创建Servlet实例和调用方法,管理整个Servlet生命周期。
Servlet容器的作用:
①创建Servlet,并且调用Servlet的相关生命周期方法
②运行JSP,Filter,Listener,Tag...等软件环境
Servlet生命周期的方法:(以下方法都是容器来调用的)
①构造器:第一次请求servlet时创建servlet实例,调用构造器方法,只有第一次请求的时候才调用,单实例,只被调用一次。
②init方法:只被调用一次,在实例后立即被调用,用于初始化当前servlet
③service:每次请求都会调用service方法,用于响应请求
④destory:只被调用一次,在当前servlet所在的WEB应用被卸载前调用,释放资源。
配置参数 load-on-startup参数:指定servlet被创建的时机。服务器一启动,则会自动创建servlet实例和调用init方法。
①配置在servlet节点中,
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.Test.HelloServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.Test.HelloServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
如果是负数,则在第一次请求时创建,如果是正数或者0,则在当前web应用被Servlet容器加载的时候创建实例,而且数值越小,越早被创建。
ServletConfig:封装了servlet的配置信息,并且可以获取ServletContext对象。
①配置servlet的初始化参数
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.Test.HelloServlet</servlet-class>
<init-param>
<!-- 初始化参数名和参数值 -->
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1230</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
注意:配置参数要放在load-on-startup前
②获取配置参数:
---》getInitParameter(String name):获取指定参数的初始化参数
---》getInitParameterNames():获取参数名组成的Enumeration对象
String user = arg0.getInitParameter("user");
System.out.println(user);
Enumeration<String> names = arg0.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name);
}
ServletContext:
①可以由ServletConfig获取
ServletContext servletcontext = servletconfig.getServletContext();
②该对象代表当前web应用的一个大管家,可以从中获取到web应用各方面的信息。
配置当前web应用的 初始化参数:这个参数可以被所有的servlet所获取,而Servlet的初始化参数只能被那个servlet所获取。
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcUrl</param-name>
<param-value>jdbc:mysql:///atguigu</param-value>
</context-param>
获取当前web应用的初始化参数:
//获取ServletContext对象
ServletContext servletcontext = arg0.getServletContext();
String driver = servletcontext.getInitParameter("driver");
System.out.println(driver);
Enumeration<String> names2 = servletcontext.getInitParameterNames();
while(names2.hasMoreElements()){
String name = names2.nextElement();
System.out.println(name);
}
获取当前web应用的某一个文件在服务器的绝对路径。(此文件必须放在WebRoot下)
--》getRealPath(String path)
获取当前应用的名字。
--》getContextPath()
获取当前web应用某一个文件对应的输入流
--》getResourceAsStream(String path):path的/ 为当前web应用的跟目录,一下用了两种方法
try {
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
System.out.println("1." + is);
InputStream is2 = servletcontext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println("2." + is2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HTTP简介与post,get请求
在浏览器的地址栏输入一个url或者点开一个超链接,请求方式是get请求,如果FROM表单中的method属性设置为get,则使用get请求
POST请求发送的数据量比GET请求的数据量大得多。文件上传的时候必须使用POST请求。
在Servlet中获取请求信息。
①Servlet的service方法用于应答请求。因为每次请求都会调用service。
ServletRequest:封装了请求信息,可以从中获取到任何请求信息
ServletResponse:封装了响应信息,如果想给客户什么信息,具体可以使用改接口的方法实现。
这两个接口的实现类都是服务器实现的,并且是服务器调用service方法的时候传入的。
ServletRequest:
获取请求参数:
String getParameter(String name):根据参数的名字返回参数值
Map getParameterMap():根据请求参数的名字返回请求参数的字符串数组(多选框)
Enumeration getParameterNames():返回参数名的Enumeration对象
String[] getParameterValues(String name):返回请求参数的键值对:key是参数名,value是参数值
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("请求来了");
String user = request.getParameter("user");
String password = request.getParameter("password");
System.out.println(user + ", "+ password);
String[] interestings = request.getParameterValues("interesting");
for(String interest :interestings){
System.out.println("-->" + interest);
}
Map<String,String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry : map.entrySet()){
System.out.println("**" + entry.getKey() + ":" + Arrays.asList(entry.getValue()));
}
}
获取请求的URL:
可以使用ServletRequest的子接口:httpServletRequesr获取与http请求相关的信息
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestURL = httpServletRequest.getRequestURL();
获取请求的方式:
String method = httpServletRequest.getMethod();
获取请求参数的字符串(get请求的参数):
String queryString = httpServletRequest.getQueryString();