附:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>web01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 全局初始化参数的配置: -->
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>654321</param-value>
</context-param>
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servletdemo1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo2</servlet-class>
<!-- 配置启动时加载 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<!-- 完全路径匹配 -->
<url-pattern>/servletdemo2</url-pattern>
<!-- 目录匹配
<url-pattern>/aaa/*</url-pattern>
-->
<!-- 扩展名匹配
<url-pattern>*.adc</url-pattern>
-->
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo3</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo3</servlet-class>
<!-- 配置servlet初始化参数 -->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo3</servlet-name>
<url-pattern>/servletdemo3</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>/servletdemo5</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo6</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo6</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo6</servlet-name>
<url-pattern>/servletdemo6</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo7</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo7</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo7</servlet-name>
<url-pattern>/servletdemo7</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo8</servlet-name>
<servlet-class>com.itheima.servlet.demo1.ServletDemo8</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo8</servlet-name>
<url-pattern>/servletdemo8</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ResponseDemo1</servlet-name>
<servlet-class>com.itheima.response.demo1.ResponseDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseDemo1</servlet-name>
<url-pattern>/responsedemo1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ResponseDem02</servlet-name>
<servlet-class>com.itheima.response.demo1.ResponseDem02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseDem02</servlet-name>
<url-pattern>/responsedem02</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RequestDemo1</servlet-name>
<servlet-class>com.itheima.request.demo1.RequestDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestDemo1</servlet-name>
<url-pattern>/requestdemo1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RequestDemo2</servlet-name>
<servlet-class>com.itheima.request.demo1.RequestDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestDemo2</servlet-name>
<url-pattern>/requestdemo2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RequestDemo3</servlet-name>
<servlet-class>com.itheima.request.demo1.RequestDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestDemo3</servlet-name>
<url-pattern>/requestdemo3</url-pattern>
</servlet-mapping>
</web-app>
Servlet
什么是生命周期
生命周期:一个对象从创建到销毁的过程。
1.Servlet生命周期
Servlet对象从创建到销毁的过程
servlet何时被创建被销毁?
Servlet中有init,service,destroy方法,这几个方法称为是servlet生命周期相关的方法。
Servlet是在第一次被访问的时候会被实例化,只要servlet一次被实例化,那么servlet中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么servlet中的service方法就会执行(在service方法发内部的方式不同调用不同的doxxx方法)。当servlet从服务器中移出或者服务器关闭的时候servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉。
代码演示:
public class ServletDemo1 implements Servlet{
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("创建servlet");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("执行servlet");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("销毁servlet");
}
}
2.Servlet的启动时加载
为什么使用启动时加载?
Servlet对象是第一次被访问的时候被创建,init方法会执行,假设在init方法中做了一些比较耗时的操作(比如说加载一些配置文件解析需要3秒钟),那么第一个用户第一次访问这个servlet的时候需要等待3秒钟(其他用户就不需要),如何使得第一个用户在第一次访问的时候不需要加载这么长时间?
什么是启动时加载?
Servlet默认是在第一次访问的时候创建对象,现在通过一个配置将sservlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建servlet的对象)。如果现在这样做那么之前花费的时间就会在服务器启动的时候一起花费掉了,对于用户体验会比较好,不需要花费额外时间取等待。
配置完成启动时加载
Servlet的访问路径的配置
1.Servlet中的url-pattern配置
完全路径匹配(优先级最高)
以 / 开始
目录匹配(其次)
以/ 开始, 以/*结束 (*代表任意字符,*位置可以输入任意字符)
扩展名匹配(最后)
不能以/开始,以*开始
ServletConfig对象
ServletConfig用来获得servlet的相关配置信息的对象
1.如何获得servletConfig对象
2.ServletConfig对象API
获得servlet的初始化参数
获得servletconfig对象
获得servlet的名称
代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得初始化参数的api
//获得servletconfig对象
ServletConfig config = this.getServletConfig();
String username = config.getInitParameter("username");
String password = config.getInitParameter("password");
System.out.println("getservletconfig:"+username+" "+password);
//2.获得所以初始化名称
Enumeration<String> names = config.getInitParameterNames();
System.out.println("getInitParameterNames:");
while(names.hasMoreElements()) {
String name = names.nextElement();
String value = config.getInitParameter(name);
System.out.println(name+ " "+value);
}
//3.获得servlet的名称
String servletName = config.getServletName();
System.out.println("getServletName(获取<servlet-name>中的名称):"+servletName);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
Servletcontext对象
Servletcontext对象之获取web项目信息
1.Servletcontext对象概述
什么是servletcontext?
Servletcontext:servlet的上下文对象,servletcontext对象对servlet之前和之后的内容都知道,这个对象一个web项目只要一个,在服务器启动的时候为每个web项目创建一个单独的servletcontext对象。
2.Servletcontext对象的作用
作用一:用来获取web项目信息
因为一个web项目只有一个servletcontext对象,所以这个对象对整个项目的相关内容都是了解的
方法:
获取文件的MIME类型:
获取web项目请求工程名
获取web项目的初始化参数
代码:
public class ServletDemo5 extends HttpServlet implements Servlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得文件的MIME的类型:
//获得servletContext
ServletContext servletContext = this.getServletContext();
String mimeType = servletContext.getMimeType("aa.txt");
System.out.println(mimeType);
//2.获得请求路径的工程名
String path = servletContext.getContextPath();
System.out.println(path);
//获得全局的初始化参数
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password");
System.out.println(username+" "+password);
//键值对的形式打印
Enumeration<String> names = servletContext.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = servletContext.getInitParameter(name);
System.out.println(name+" "+value);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
作用二:读取文本项目下的文件
之前使用Io流就可以读取(java项目中的文件),现在是一个web项目,web项目需要发布到tomcat才能访问。获取web项目下的文件如果使用传统的IO就会出现问题(原因:路径中使用的是相对路径,相对的是JRE环境,不是tomcat环境)
代码
3.servletContexe对象之作为域对象存取数据
什么是域对象
域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围,域指的是一定的作用范围。
servletContext作为域对象
servletContext作为域对象的API
存入数据:
获取数据:
移出数据:
servletContext作为域对象的作用范围
servletcontext是在服务器启动的时候为每个web项目单独创建一个servletcontext对象,当web项目从服务器中移除,或者是关闭服务器的时候servletcontexe对象会被销毁(从启动到关闭),向servletcontext中保存到数据一值存在(当服务器关闭的时候servletcontext对象被销毁然后里面的数据才会失效)范围:整个web应用。
代码演示看web01/…/servletdemo7, servletdemo8.(先执行7,因为需要先加载数据到域对象,如果先执行8,域中无数据,输出null)
demo7:
package com.itheima.servlet.demo1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servletcontext域对象使用
*/
public class ServletDemo7 extends HttpServlet {
@Override
public void init() throws ServletException {
//当servletDemo7被创建,初始化一个值
this.getServletContext().setAttribute("name","张三");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String name=(String) this.getServletContext().getAttribute("name");
out.println("用户名为:"+(String) this.getServletContext().getAttribute("name")+"<br/>");
System.out.println("name:"+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
demo8:
package com.itheima.servlet.demo1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servletcontext域对象使用
*/
public class ServletDemo8 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String name=(String) this.getServletContext().getAttribute("name");
out.println("用户名为:"+(String) this.getServletContext().getAttribute("name")+"<br/>");
System.out.println("name:"+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Response对象
1.什么是response对象
开发软件是B/S结构的软件,可以通过浏览器访问服务器的软件,从浏览器输入一个地址访问服务器(将这个过程称之为请求),服务器收到请求,需要进行处理,处理以后需要将处理结果回显浏览器端(将这个过程称之为响应)。
画图说明:
2.Response的API
Response关于响应行的方法
设置响应的状态码:
200: 表示请求成功
302: 表示请求重定向
304:表示查找本地缓存
404:表示请求地址错误
500:表示服务器内部错误,代码错误
Response关于响应头的方法
Set方法开头:针对一个key对于一个value的情况。
举例:比如有一个头content-Type:text/html setHeader(“content-type”,”text/plain”);
最终得到的结果:content-Type:text/plain
Add开头的方法:针对一个key对应一个value的情况
举例:比如有一个头content-Type:text/html setHeader(“content-type”,”text/plain”);
最终得到的结果:content-Type:text/html, text/plain
Response关于响应体的方法
Response其他的API
重定向方法
设置浏览器打开页面采用的字符集
设置响应字符流的缓冲区字符集
服务器向浏览器回写cookie的方法
3.代码演示
设置状态码:
完成重定向:
302状态码和location响应头结合使用的效果
注:重定向后面的地址其实就是映射。
实际开发中一般使用
Response.setRedirect(“路径”);
例·Response.setRedirect(“/web01/responsedem02”);
定时刷新
4.Response对象响应中文乱码的处理
使用字节流响应中文
使用字符流响应中文
解决方法:
添加代码:
response.setContentType("text/html;charset=utf-8");
或者:设置服务器字符集编码+设置浏览器字符集编码来保持编码一致
Response.setCharterEncoding(“UTF-8”); + response.setHeader(“comtent-Type”,”text/html;charset=UTF-8”);
关于两个案例代码:
/**
* 设置响应状态码
* 使用状态码和location头完成重定向
*/
public class ResponseDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//完成重定向
// response.setStatus(302);
//设置响应头
// response.setHeader("Location", "/web01/responsedem02");
//定时刷新
response.setHeader("Refresh", "5,url=/web01/responsedem02");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
/**
* 定向的页面
*
*/
public class ResponseDem02 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("ResponseDemo2页面");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
request对象
1.什么是request对象?
开发的软件都是B/S结果软件,从浏览器向服务器提交一些数据,将这些内容进行封装就封装成了一个请求对象(request对象)
2.Request对象的API
获得客户机信息
获得请求方式
获得请求路径后的提交参数的字符串
获得请求路径的URL+URI
获得客户机的IP地址
获得请求头的方法:
获得一个key对应一个value的请求头
获得一个key对应多个value的请求头
获得提交的参数
获得提交的参数(一个name对应一个value)
获得提交的参数(一个name对应多个value)
获得提交的参数,将提交的参数的名称和对应的值存入map集合当中
Request作为域对象存取数据的方法
向request域中存数据
向request域中获取数据
从request域中移出数据
获得客户机信息代码演示
获得请求头代码
3.Request对象接收表单请求参数
编写一个静态页面
<form action="/web01/requestdemo2" method="get">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="famale" />女<br/>
<input type="radio" name="sex" value="male" />男<br/>
籍贯:<select name="city">
<option value="beijing">北京市</option>
<option value="shanghai">上海市</option>
<option value="shenzhen">深圳市</option>
</select><br/>
爱好:<input type="checkbox" name="hobby" value="basketball" />篮球
<input type="checkbox" name="hobby" value="football" />足球
<input type="checkbox" name="hobby" value="volleyball" />排球<br/>
自我介绍:<textarea name="info" rows="3" cols="8"></textarea>
<input type="submit" value="提交"/>
</form>
注:form中的地址不是文件的地址,是映射的地址,就是在浏览器中可以访问的地址。
接受请求参数代码:
package com.itheima.request.demo1;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Request接收表单数据
*/
public class RequestDemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收表单提交的信息
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String city = request.getParameter("city");
//接收爱好
String []hobby = request.getParameterValues("hobby");
//接收自我介绍
String info = request.getParameter("info");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("性别:"+sex);
System.out.println("籍贯:"+city);
System.out.println("爱好:"+Arrays.toString(hobby));
System.out.println("自我介绍:"+info);
System.out.println("------------");
//使用getParmeterMap接收数据:
Map<String, String[]> map = request.getParameterMap();
for (String key:map.keySet()) {
String[] value = map.get(key);
System.out.println(key+" "+Arrays.toString(value));
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
显示结果:
Request对象接收表单请求参数的中文乱码问题
解决Post方式提交代码演示
/**
* 演示post方式处理中文乱码
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收数据
/**
* 产生乱码的原因:
* post方式提交的数据实在请求头中,request对象接收到数据之后,放入request的缓冲区中,缓冲区就有编码(默认ISO-8859-1,不支持中文)
* 解决方案:
* 将request的缓冲区的编码修改了即可
*/
//设置缓冲区的编码
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("姓名:"+name);
}
解决Get方式提交代码演示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收数据
/**
* 产生乱码的原因:
* get方式提交的数据实在请求行的url后面,在地址栏上其实已经进行了一次url的编码了
* 解决方案:
* 将存入到request缓冲区中的值以ISO-8859-1的方式获取到,以UTF-8的方式进行解码
*/
String name = request.getParameter("name");
//String encode = URLEncoder.encode(name,"ISO-8859-1");
//String decode = URLDecoder.decode(encode,"UTF-8");
//System.out.println("姓名:"+decode);
String value = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("姓名:"+value);
}
总结:以上就是关于servlet,request,response的基本的一些理论知识和使用,这些也是我看视频自学的笔记,可能有些地方没说清楚,见谅见谅。