1. Servlet
定义: ( 小型服务器接口) 是Java里面的接口;
访问服务器: 实际上就是访问Sevrlet ( Sevrlet是个容器,里面有访问的动态资源 );
Servlet的生命周期方法; 实例化--初始化---服务方法--销毁方法;
注意: Sevrlet只创建一次,当你再次访问Sevrlet的时候,不会创建新的Sevrlet,只会调用service方法;
访问Sevrlet需要通过xml配置文件来访问!
1.1 创建sevrlet第一种方式: 直接实现Sevrlet接口
public class Demo01 implements Servlet {
//实例化方法(创建对象无参构造方法) 不管声明周期是啥,对象先创建出来
public Demo01() {
System.out.println("实例化对象的无参构造方法");
}
// 出生声明周期方法;初始化方法,初始化Servlet配置信息; 穿进去参数就是配置信息;
public void init(ServletConfig arg0) throws ServletException {
System.out.println("初始化init方法被调用了");
}
// 服务方法接收请求,响应结果; ----作用处理用户的请求,处理完成之后响应给用户;
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service方法被调用");
}
// Servlet 的 销毁
//1.服务器关闭被调用,相当于停止会调用
//2.该应用程序被移除也会调用,
public void destroy() {
System.out.println("我是destory销毁方法被调用了");
}
//获取Servlet配置信息的方法;
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
//获取Servlet版本作者等信息的方法;
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
2. 创建方式2
利用( 缺省适配器 ) 继承了一个实现了Sevrlet接口的类( GenericServlet );
然后只重写一个service方法就行了
public class Demo02 extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("demo02的----service");
}
}
3. 创建方式3
继承 一个继承了( GenericServlet 类 ) 的类!
重写 doGet和doPost方法! ( 浏览器是访问是doGet里面的内容 )
浏览器发送的请求,都是get请求! 在post的方法里面调用doget()放法;用一种
GET和POST请求区别 https://zhidao.baidu.com/question/1695925461424058828.html
public class Demo03 extends HttpServlet {
// 重写doGet和doPost方法; get和post方式,
// 注意重写完之后不要调用父类的,doGet方法, 否则只会发送错误;
// 从浏览器发送的请求,都是get请求;(拼接字符串)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
//不管什么方式都可以调用doGet两种请求共用一个处理方式;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
二 . 获取Sevrlet的配置对象
2.1 servletConfig对象( 每个sevrlet都有 ) 共两种方式;在配置文件里面sevlet标签里面;
当servlet配置了初始化参数后,web容器在创建servlet对象的时候会自动将这些初始化参数分装到ServletConfig对象当中去,并在调用servlet的init方法的时候将ServletConfig对象传递给servlet,进而程序员可以通过ServletConfig对象就可以获得web应用的初始化参数。
方式1:
public class Demo01 extends HttpServlet {
//获取方式1.声明一个成员变量.保存该对象;
private ServletConfig config;
//初始化方法:
@Override
public void init(ServletConfig config ) throws ServletException {
super.init(config);
//给成员变量赋值;
this.config=config;
}
方式2.直接调用父类的方法;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//fun1获取config信息();
//获取方法2,直接调用父类的方法;
ServletConfig myconfig = this.getServletConfig();
String value = myconfig.getInitParameter("dahai");
System.out.println(value);
}
3.获取多个配置信息
private void fun1获取config信息() {
System.out.println(this.config);
// 可以通过config对象,获取servlet的配置信息; 我们自己写
// 获取servlet配置信息
String value = this.config.getInitParameter("wanglong");
System.out.println(value);
// 获取多个配置信息
Enumeration<String> names = this.config.getInitParameterNames();
while (names.hasMoreElements()) {
System.out.println(names.nextElement());
}
}
2.2 域对象 ---SevrletContext ( 作用范围最大的域对象 )
* 域对象: 域表示一定的范围内 有作用的对象,
* SevrletContext(作用范围最大的域对象) Context: 环境
* 作用域整个工程 都能使用该对象;
* 并且整个项目只有一个该对象(单例对象)
* 作用: 利用单例的特点, 可以进行传值,该对象内部维护了一个map集合;(实际上就是一个map集合)
* 注意: 所有的域对象 内部都是维护一个map集合,都可以保存和获取值;
* 所有的域对象都有setAttribute
* getAttribute() 方法;
*
*
* 获取SevrletContext对象,
* 方式1: 可以通过SevrletConfig对象来获取;
* 方式(2) 通过父类方法来获取 该方法在SevrletConfig接口中
*
*
* 作用1: 存值取值
* 作用2: 获取全局配置信息
* 作用3: 获取服务器上所有的资源真实路径;
* 真实路径(在服务器上的路径)
* getRealPath();
* 作用4: 可以进行请求转发;
1.获取域对象
方式1;先获取ServletConfig,再获取SevrletContext;
private void fun1获取configcontext() {
ServletContext context = this.getServletConfig().getServletContext();
}
方式2 直接调用从父类继承过来的方法;
ServletContext context = this.getServletContext();
2: 域对象在Xml配置文件中存在的位置!
3.1 作用1: 存值取值
public class Demo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletConfig().getServletContext();
// 向context中保存一个值 可以demo02 存 demo03取
//先访问2,再访问3;
context.setAttribute("username", "wanglong"); //此处往context里面存值;
}
}
2.可以在demo03中进行获得值 getAttribute( " username" )
package com.lanou3g;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取域对象
ServletContext context = this.getServletConfig().getServletContext();
Object object = context.getAttribute("username");
System.out.println(object);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3.3 : 作用三 :获取服务器上的资源路径 getRealPath( "服务器上相对于Webcontent 的路径" )
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//读取a文件
//参数的路径是相对于工程名来填的; 也就是sh-web-02的路径; 让人从服务器上下载;
// fun1();
//读取b文件,b文件是挂在服务器上的;
String realPath = this.getServletContext().getRealPath("WEB-INF/classes/com/lanou3g/b.properties");
System.out.println(realPath);
FileInputStream fileInputStream = new FileInputStream(realPath);
Properties properties = new Properties();
properties.load(fileInputStream);
System.out.println(properties.getProperty("key"));
}
3.4 : 作用四: 请求转发: ( 请求一次做了多次跳转 )
1. 第一步获取转发器:
getRequestDispatcher( "/demo06" );
1. 第二步请求转发: 利用转发器
forward( request, response )
package com.lanou3g;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 请求转发; 我们只访问了demo05 可以把Demo06的内容打印出来;
* 1. 用户只发送了一次请求,并且用户请求时并不知道网站内部做了什么操作;
*/
public class Demo05 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("晓峰借点钱给我");
System.out.println("我没有钱 坤有钱 你去找他");
// 第一步 通过context对象获取请求转发器
//注意: 请求转发只能是本工程站内转发;
//填转发路径是相对于你的工程; /杠代表工程名后面的路径; 你要给他一个去往的路径;
RequestDispatcher requestDispatcher = this.getServletContext().getRequestDispatcher("/demo06");
//第二步请求转发; 利用转发器
requestDispatcher.forward(request, response);
System.out.println("钱接到了,人傻好办事");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4. 如何写文字到浏览器 : 接到请求后服务器doGet方法触发
1. 通过响应对象response中的流对象 回写到浏览器,可以获取字符流
PrintWriter writer = response. getWriter();
P.writer( "欧阳" );
注意:TomCat默认的编码格式是 iso-8859-1.写到浏览器上会乱码!
解决方式1 : 第一步设置编码个格式 : response.setCharaterEncoding( "UTF-8" ) --- 解决编码格式问题!
第二步: 设置响应头,告诉浏览器用什么格式来解析, 解决解析格式问题
response.setContentType( " text/html;charset=utf-8 " )---告诉浏览器用utf-8来解析;
5. 响应 ( response)
响应行: 响应状态码 200表示ok;
响应头: 告诉浏览器你要有什么操作;
响应体:响应浏览器内容
6. 如何从服务器中下载图片.
第一步: 选中一张图片放入到服务器中: 注意放入src下面相当于放在classes下面;
第二步: 添加响应头;1. 为了告诉浏览器 你这张图片是要下载 2: 告诉浏览器文件的名字和文件类型
content-disposition attachment;filename= ( 如何获取文件名 tz.png )
content-type image/jpeg ------ tomcat config 里面有个web-xml 里面有格式;
第三步: 开始读文件 使用FileInputStream进行读文件;
第四步:从响应里面获取:写的文件 response.getOutputStream();
第五步:开始你的读写;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取服务器的图片路径
// 一般context域 使用application当名字 如果放在src下面 就是这个路径("/WEB-INF/classes/tz.png")
// 找到域然后找到路径;
String realPath2 = this.getServletContext().getRealPath("/WEB-INF/classes/tz.png");
// 截取文件名
File file = new File(realPath2);
String filename = file.getName();
//修改文件名下载格式
filename = new String(filename.getBytes(), "iso-8859-1");
// 添加响应头
response.setHeader("content-disposition", "attachment;filename=" + filename);
response.setHeader("content-type", "png");
//读文件
FileInputStream fileInputStream = new FileInputStream(realPath2);
//通过response对象 获取字节流; 从响应流中获取到的流,目的地就是网站; 所以你就不用给写的路径了;
ServletOutputStream outputStream = response.getOutputStream();
//将图片写回服务器 ;回写
int len=0;
byte [] bs= new byte[1024];
while ((len=fileInputStream.read(bs))!=-1) {
//将图片写回服务器
outputStream.write(bs, 0, len);
}
fileInputStream.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
7.请求重定向
注意: 可以填站内路径,也可以填站外路径, 如果站内路径需要带上工程名, 和请求转发不一样;
2. 请求重定向是两次请求, 第二次是接收到第一次请求以后发出的,;
实现方式: 第一步: 添加响应头: response.setHeader( "location",/sh-web-02/demo11 );
站外: response.setHeader( " http://www.baidu.com" )
第二步: 添加响应状态码 302: response.setStatus( 302 );
7.1 设置3秒后跳转一个页面 3秒后开始跳转; 和每隔一秒刷新一下页面
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//fun1(response);
//3秒后跳转一个页面 3秒后开始跳转;调转到 demo11去;
//response.setHeader("refresh", "3;url=/sh-web-02/demo11");
//每隔1秒刷新界面
response.setIntHeader("refresh", 1);
PrintWriter writer = response.getWriter();
//随机数是double类型
writer.write(Math.random()+"");
}

8 .获取请求中路径的方法 request. getMethod() --getRequestURL() URI() getContextPath();
//System.out.println("rsjfsdjflksadjf;dlsajfklsadjfl;dsajfkl;dsajfk;jdsal;kfj");
//请求中的方法
//获取请求的而方式, 是get 还是post;
String method = request.getMethod();
System.out.println(method); //从浏览器出来的都是get请求;
//获取请求的URL; http://localhost:8080/sh-web-02/demo11
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//获取请求的URI; /sh-web-02/demo11 getRequestURI()获取请求页面的相对路径,
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//获取请求网址的相对路径 /sh-web-02
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取表单提交的数据