1.Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
2.pattern 模式
3.
4.
在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是:
标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
5.
(1)配置初始化参数
<!-- 配置web应用初始化参数 ,局部的初始化参数,直接在servlet里面配置-->
<servlet>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>lily</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
(2)获取初始化参数,即:ServletConfig对象的使用
>getInitParameter获取指定参数名的初始化参数
>getInitParameterNames获取参数名组成的对象
public void init(ServletConfig servletConfig) throws ServletException {
// Put your code hereSystem.out.println("我爱李莉");
//通过下面2种方式获得初始值
String user=servletConfig.getInitParameter("user");
System.out.println("user:"+user);//获取多个name值
Enumeration<String> names=servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name=names.nextElement();
String value=servletConfig.getInitParameter(name);
System.out.println("--"+name+":"+value);
}}
enumerate枚举
6.ServletContext接口
由ServletConfig获取
代表当前web应用,可以获取当前代表应用的各方面信息
Servlet引擎为每个web应用程序都创建了一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。
web应用程序中所有的Servlet都共享同一个ServletContext对象,所以ServletContext对象被称之为application对象
功能:
获取web应用程序的初始化参数
application域范围的属性
获取虚拟路径所映射的本地路径
(1)获取当前web应用的初始化参数
context 环境,上下文,来龙去脉
<!-- 配置web应用初始化参数 ,全局的初始化参数,可以被所有的servlet获取-->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdebc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcUrl</param-name>
<param-value>jdbc.mysql://</param-value>
</context-param>
ServletContext servletContext=servletConfig.getServletContext();
String driver=servletContext.getInitParameter("driver");
System.out.println("driver:"+driver);
//获取多个name值
Enumeration<String> names_1=servletContext.getInitParameterNames();
while(names_1.hasMoreElements()){
String name_1=names_1.nextElement();
String value_1=servletContext.getInitParameter(name_1);
System.out.println("-->"+name_1+":"+value_1);
}
(2)获取当前web应用的某个文件在服务器上的绝对路径,而不是部署的物理路径
//获取文件路径
String realPath=servletContext.getRealPath("/servletDemo/WebRoot/index.jsp");
System.out.println(realPath);
结果是:D:\apache-tomcat-7.0.72\webapps\servletDemo\servletDemo\WebRoot\index.jsp
(3)获取当前web应用的名称
String contextPath=servletContext.getContextPath();
System.out.println(contextPath);
结果是:/servletDemo xml文件中更改成这个路径了
(4)获取当前web应用某一个文件对应的输入流
getResourceAsStream(String path);//path为当前web应用的根目录
InputStream a1=servletContext.getResourceAsStream("/servletDemo/WebRoot/index.jsp");
(5)和.attribute相关的几个方法
7.get请求和post请求
http用于定义web浏览器和web服务器之间交换数据的过程以及数据本身的格式
(1)发送get请求有以下几种情况
超链接
<form>中使用get
get传递的数据量<1K
get把请求参数追加到url后面
(2)post
<form>中使用post
post方式把各个表单字段元素和数据作为http消息的实体内容发送给web服务器
8.servlet中获取信息
(1)service方法,每次都会调用
public void service(ServletRequest servletRequest,ServletResponse servletResponse){
System.out.println(servletRequest);
};
结果显示:org.apache.catalina.connector.RequestFacade@39a63eb0 是Apache服务器帮忙实现的
实际山,ServletRequest和ServletResponse这两个接口的实现类都是Apache服务器帮忙实现的,并在apache服务器调用自身方法service的时候传入
ServletRequest:封装了请求信息,可以从中获取任何请求信息
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现,
(2)ServletRequest
——>String getParameter(String name)
根据请求参数的名字,返回参数值。如果请求参数有多个值,该方法只能获取到第一个提交的值
——>String [] getParameterValues(String name)
根据请求参数的名字,返回一组值
String [] interesting=request.getParameterValues("interesting");
for(String interest:interesting){
System.out.println(interest);
}
——> Map getParameterMap()
返回请求参数的键值对:key:参数名,value:参数值,String数组类型
获得的是一个String数组
Map<String,String[]> map=(Map<String, String[]>) request.getParameterMap();
for(Map.Entry<String,String[]> entry:map.entryset){
System.out.println(entry.getKey()+":"+Arrays.asList(entry.getValue()));
}
——> Enumeration getParameterNames()
用于返回参数名对应的Enumeration 对象,类似于ServletConfig(或者ServletContext)里面的getInitParameterNames()
Enumeration<String> names=request.getParameterNames();
while(names.hasMoreElements()){
String name=names.nextElement();
String value=request.getParameter(name);
System.out.println(name+":"+value);
——> String[] getParameterValues()
-> 获取请求的url
//下面进行强制转换,因为HttpServletRequest里面封装的方法是可用的
HttpServletRequest httpServletRequest=(HttpServletRequest) request;
String requestURL=httpServletRequest.getRequestURI();
System.out.println("请求的url地址为:"+requestURL);
结果为:请求的url地址为:/servletDemo/loginServlet
注:http://localhost:8080/servletDemo/loginServlet 的站点为:http://localhost:8080,url地址为:/servletDemo/loginServlet
-> 获取请求的“方法”
//下面进行强制转换,因为HttpServletRequest里面封装的方法是可用的
HttpServletRequest httpServletRequest=(HttpServletRequest) request;
String method=httpServletRequest.getMethod();
System.out.println("请求的method为:"+method);
结果为:请求的method为:POST
-> 获取请求的查询字符串。如果是get请求,就是“?”后面的那一串。如果是post请求,就没有
String query=httpServletRequest.getQueryString();
System.out.println("请求的查询字符串为:"+query);
结果为:请求的查询字符串为:user=11&password=22&interesting=reading&interesting=game&interesting=basktable
-> 获取Servlet的映射路径
String servletPath=httpServletRequest.getServletPath();
System.out.println("servlet的映射路径是:"+servletPath);
结果为:servlet的映射路径是:/loginServlet
-> HttpServletRequest是ServletRequest的子接口,针对http请求所定义里面包含了大量的获取http请求的方法
(2)ServletResponse
说明:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现
-> getWriter();返回PrintWriter
PrintWriter out=response.getWriter();
out.println("hello lily...");
结果为:浏览器用户界面会显示内容为hello lily...
-> response.setContentType("响应类型");用来设置相应的内容类型
response.setContentType("application/msword");//这类设置响应的内容类型
PrintWriter out=response.getWriter();
out.println("hello lily...");
结果为:浏览器会自动下载一个word文档,内容为hello lily...
-> void sendRedirect(String location):请求的重定向,此方法在HttpServletRequest中定义,所以要先进行强制转换,然后才能定义
(2)HttpServlet
(1)是一个servlet,继承自GenericSevlet,针对http协议所定制
(2)实现的细节:在service()方法中直接把ServlevtRequest和ServlevtResponse转化为HttpServlevtRequest和HttpServlevtResponse,并重新调用重载的service(HttpServlevtRequest,HttpServlevtResponse)。在service中获取请求的方式:String method=request.getMethod(),紧接着创建doGet方法或者doPost方法
参考下面具体实现过程:
package com.guigu.javaweb;
import java.io.IOException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
//基于http协议定义的基类
public class HttpServletRequest extends HttpServlet {
private static final long serialVersionUID = 1L;
public void service(ServletRequest arg0,ServletResponse arg1) throws IOException {
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){
//1.获取请求方式
String method=request.getMethod();
//2.根据请求方式选择对应的处理方法
if("GET".equalsIgnoreCase(method)){
doGet(request, response);
}
else if ("POST".equalsIgnoreCase(method)) {
doPost(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
}
private String getMethod() {
return null;
}
}
(3)实际开发中,直接继承HttpServlevt,并根据请求方式复写do×××方法(doGet方法或者doPost方法)
(4)优点:直接由针对性的覆盖do×××方法,直接使用HttpServlevtRequest和HttpServlevtResponse,不在使用强行转换
(5)GenericSevlet:Servlet和ServletConfig的继承