1.Servlet概念

运行在服务器端的小程序。

Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

将来我们自定义一个类,实现Servlet接口,复写方法。

快速入门:

1. 创建JavaEE项目
2. 定义一个类,实现Servlet接口
  public class ServletDemo1 implements Servlet

3. 实现接口中的抽象方法

  1. package cn.itcast.web.servlet;
  2.  
  3. import javax.servlet.*;
  4. import java.io.IOException;
  5.  
  6. public class ServletDemo1 implements Servlet {
  7. @Override
  8. public void init(ServletConfig servletConfig) throws ServletException {
  9.  
  10. }
  11.  
  12. @Override
  13. public ServletConfig getServletConfig() {
  14. return null;
  15. }
  16.  
  17. @Override
  18. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  19. System.out.println("hello servlet...");
  20. }
  21.  
  22. @Override
  23. public String getServletInfo() {
  24. return null;
  25. }
  26.  
  27. @Override
  28. public void destroy() {
  29.  
  30. }
  31. }

4. 配置Servlet
  在web.xml中配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!--配置serlvet-->
  7. <servlet>
  8. <servlet-name>demo1</servlet-name>
  9. <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>demo1</servlet-name>
  13. <url-pattern>/demo1</url-pattern>
  14. </servlet-mapping>
  15. </web-app>

实现原理

1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法

2.注解配置

Servlet3.0:
好处:
  支持注解配置。可以不需要web.xml了。

步骤:
  1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  2. 定义一个类,实现Servlet接口
  3. 复写方法
  4. 在类上使用@WebServlet注解,进行配置
    @WebServlet("资源路径")

  1. package cn.itcast.web.servlet;
  2.  
  3. import javax.servlet.*;
  4. import javax.servlet.annotation.WebServlet;
  5. import java.io.IOException;
  6. @WebServlet("/demo")
  7. public class ServletDemo1 implements Servlet {
  8. @Override
  9. public void init(ServletConfig servletConfig) throws ServletException {
  10.  
  11. }
  12.  
  13. @Override
  14. public ServletConfig getServletConfig() {
  15. return null;
  16. }
  17.  
  18. @Override
  19. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  20. System.out.println("hello servlet...");
  21. }
  22.  
  23. @Override
  24. public String getServletInfo() {
  25. return null;
  26. }
  27.  
  28. @Override
  29. public void destroy() {
  30.  
  31. }
  32. }

3.Servlet的体系结构

Servlet -- 接口
   |
GenericServlet -- 抽象类
   |
HttpServlet -- 抽象类

GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。

  1. package cn.itcast.web.servlet;
  2.  
  3. import javax.servlet.*;
  4. import javax.servlet.annotation.WebServlet;
  5. import java.io.IOException;
  6. @WebServlet("/demo")
  7. public class ServletDemo2 extends GenericServlet {
  8. @Override
  9. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  10. System.out.println("hello servlet2...");
  11. }
  12. }

HttpServlet:对http协议的一种封装,简化操作。
  1. 定义类继承HttpServlet
  2. 复写doGet/doPost方法

  1. package cn.itcast.web.servlet;
  2.  
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9.  
  10. @WebServlet("/demo")
  11. public class ServletDemo3 extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. System.out.println("doGet...");
  15. }
  16.  
  17. @Override
  18. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  19. System.out.println("doPost...");
  20. }
  21.  
  22. }

4.缺省路径

4.1 什么是缺省路径

在tomcat服务器内部配置了一个缺省路径 <url-pattern>/</url-pattern>, 这个缺省路径在tomcat服务器内部被一个缺省Servlet(DefaultServlet)匹配。缺省的这个Servlet的作用是专门用于处理所有网站中的静态网页。

浏览器: http://localhost:8080/day09/hello.html

一个路径在tomcat服务器的执行过程:

1)搜索day09下面的web.xml文件信息。搜索是否存在匹配的<url-pattern>

2)匹配到对应的url-pattern,执行对应的Servlet程序。

3)如果没有匹配的url-pattern,就把这个请求交给tomcat服务器的DefaultServlet处理。

4)DefaultServlet会在day09的根目录下搜索是否存在一个名称叫hello.html的文件。

5)如果找到次文件, 那么DefaultServlet读取该文件内容返回给用户。

6)如果找不到次文件, 那么就给用户返回一个404状态码+404错误页面。

 结论: 先找动态网页,再找静态网页。

5.Sevlet的生命周期(重点)

5.1 概念

研究servlet的生命周期,就是研究servlet这个在什么时候创建对象,在什么时候调用什么方法,在什么时候销毁对象。

以前: new Student();

现在:  servlet是由tomcat服务器执行的生命周期。

5.2 Sevlet的四个重要的生命周期方法

构造方法: 创建servlet对象时调用,只调用1次,证明了sevlet是单例的。

init方法: 创建完对象之后调用。只调用1次。该方法用于初始化对象。

Servlet什么时候被创建?
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Servlet的创建时机。
在<servlet>标签下配置
1. 第一次被访问时,创建
  <load-on-startup>的值为负数
2. 在服务器启动时,创建
  <load-on-startup>的值为0或正整数

service方法: 在每次请求时调用,调用n次。该方法入口方法,我们的逻辑代码在这里被调用。

destory方法:在servlet对象销毁之后调用。只调用1次。重新部署网站或者停止服务器,servlet对象就会销毁了。

5.3 用伪代码演示tomcat服务器如何调用四个方法

字符串: gz.itcast.a_servlet.HelloServlet

1)通过反射,创建HelloServlet的对象

1.1 得到HelloServlet的CLass对象

Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ")

1.2 通过class对象调用构造方法

Object obj  =  clazz.newInstance();  调用无参的构造方法。  --1)构造方法被调用

2)通过反射,调用init方法

2.1 得到init方法对象

Method m = clazz.getDeclaraeMethod("init",ServletConfig.class);

2.2 调用方法

m.invoke(obj,config);  -2)init方法被调用

3)通过反射,调用service方法

3.1 得到service方法对象

Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

3.2 调用方法

m.invoke(obj,request,response);          --3)service方法被调用

4)通过反射,调用destroy方法

4.1 得到destroy方法对象

Method m= clazz.getDeclareMethod('destroy",null);

4.2调用方法

m.invoke(obj,null);                --4)destroy方法被调用

  1. package day09Servlet.cn.jxufe.c_life;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.enterprise.context.Destroyed;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. public class LifeDemo1 extends HttpServlet {
  12. /*
  13. * 1)构造方法。servlet对象创建时调用的
  14. */
  15. public LifeDemo1() {
  16. // TODO Auto-generated constructor stub
  17. System.out.println("servlet对象被创建了");
  18.  
  19. }
  20.  
  21. /*
  22. * 2)初始化方法
  23. */
  24. @Override
  25. public void init() throws ServletException {
  26. // TODO Auto-generated method stub
  27. System.out.println("init方法被调用");
  28.  
  29. }
  30.  
  31. /*
  32. * 3)服务方法
  33. */
  34. @Override
  35. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  36. // TODO Auto-generated method stub
  37. System.out.println("service方法被调用");
  38. }
  39.  
  40. /*
  41. * 4)销毁方法。sevlet对象销毁时调用的
  42. */
  43. @Override
  44. public void destroy() {
  45. // TODO Auto-generated method stub
  46. System.out.println("servlet对象被销毁了");
  47.  
  48. }
  49.  
  50. }

6.Servlet的线程并发问题

6.1 引入

servlet在tomcat服务器中,是单实例多线程的

6.2 开发线程安全的servlet建议

1)尽量不要使用成员变量,或者静态成员变量。

2)必须要使用成员变量,要么给使用了成员变量的代码块加同步锁,加锁的代码块的范围尽量缩小,因为有可能影响程序并发效率。

  1. package day09Servlet.cn.jxufe.d_thread;
  2.  
  3. /*
  4. * servlet的多线程并发问题
  5. */
  6. import java.io.IOException;
  7.  
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. public class ThreadDemo extends HttpServlet {
  14. public ThreadDemo() {
  15. System.out.println("TheadDemo对象创建了");
  16. }
  17.  
  18. // 成员变量,那么该数据就可能被不同用户线程共享到。有可能引发多线程并发问题。
  19. static int count = 1;
  20.  
  21. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22. response.setContentType("text/html;charset=utf-8");
  23. /**
  24. * 1)同步代码块
  25. * 给使用到共享数据的代码块添加同步锁
  26. * 注意:同步锁必须多个线程唯一的
  27. */
  28. synchronized (ThreadDemo.class) {
  29. response.getWriter().write("你当前是第" + count + "个访客!"); // A线程刚刚执行完这句代码,被B线程抢去了执行时机。
  30.  
  31. // 睡眠
  32. /*try {
  33. Thread.sleep(10000);
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }*/
  37. count++;
  38. }
  39.  
  40. }
  41. /**
  42. * 2 )同步方法
  43. * @param response
  44. */
  45. /*public synchronized static void method(HttpServletResponse response){
  46. try {
  47. response.getWriter().write("你当前是第"+count+"个访客!");
  48. } catch (IOException e1) {
  49. e1.printStackTrace();
  50. } // A线程刚刚执行完这句代码,被B线程抢去了执行时机。
  51.  
  52. //睡眠
  53. try {
  54. Thread.sleep(10000);
  55. } catch (InterruptedException e) {
  56. e.printStackTrace();
  57. }
  58. count++;
  59. }*/
  60. }

7.Servlet的自动加载机制

7.1 引入

默认情况servlet对象是在第一次访问的时候创建。如果在这个servlet的构造方法或者init方法执行比较多的逻辑,那么第一次访问servlet的用户体验就不好!

那么能不能改变创建servlet的机制?  可以的,可以让servlet在服务器启动的时候自动加载。

  1. <servlet>
  2. <servlet-name>LifeDemo</servlet-name>
  3. <servlet-class>gz.itcast.c_life.LifeDemo</servlet-class>
  4. <!-- 这个配置可以让servlet在tomcat服务器启动的时候自动创建servlet对象 -->
  5. <load-on-startup>1</load-on-startup> <--加这一句话就可以在加载的时候启动-->
  6. </servlet>

注意:load-on-startup中的整数值越大,创建的优先级越低!!!

8.Servlet的init方法

8.1 两个init方法作用

init(ServletConfig) 这个有参数的init方法的作用就是Servlet的其中一个重要的生命周期方法。这个方法一定会被tomcat服务器调用。

init(): 这个无参的init方法的作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑。这个方法才是真的给开发者做初始化逻辑的方法。

小结:

Servlet开发中涉及的对象:

HttpservletRequest对象: 请求对象

HttpServletResponse对象: 响应对象

ServletConfig对象: servlet配置对象

ServletContext对象: servlet的上下文对象

9.ServletConfig对象

9.1 引入

servletconfig是配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息。

9.2 配置初始化参数

  1. <servlet>
  2. <servlet-name>ConfigDemo</servlet-name>
  3. <servlet-class>day09Servlet.cn.jxufe.e_config.ConfigDemo</servlet-class>
  4. <!-- servlet的初始化参数 -->
  5. <init-param>
  6. <param-name>path</param-name>
  7. <param-value>e:/aaa.txt</param-value>
  8. </init-param>
  9.  
  10. </servlet>

在servlet中获取初始化参数

config.getInitParameter("name");  根据参数名称获取参数值

config.getInitParameterNames();   获取所有参数名称

  1. package day09Servlet.cn.jxufe.e_config;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6.  
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class ConfigDemo extends HttpServlet {
  13.  
  14. /*private ServletConfig config
  15. * 已经封装了这个方法,不用自己写了,直接用this调用就可以了;
  16.  
  17. @Override
  18. public void init(ServletConfig config) throws ServletException {
  19. this.config = config;
  20. }*/
  21.  
  22. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. String path = null;
  24.  
  25. /**
  26. * 读取到servlet的初始化参数(init-param)
  27. */
  28. path = this.getServletConfig().getInitParameter("path");
  29.  
  30. /**
  31. * 读取文件内容
  32. */
  33. BufferedReader br = new BufferedReader(new FileReader(path));
  34. String str = null;
  35. while ((str = br.readLine()) != null) {
  36. System.out.println(str);
  37. }
  38.  
  39. }
  40.  
  41. }

10.ServletContext对象

10.1 引入

ServletConfig对象叫servlet上下文对象。 一个网站只会创建一个ServletContext对象。代表的是整个网站的环境信息。

10.2 获取ServletContext对象

this.getServletConfig().getServletContext();  通过ServletConfig对象来获取到ServletContext对象的!!

伪代码:

ServletContext对象:启动的时候创建

ServletConfig对象:调用init方法之前创建的,在ServletContext对象创建之前

public ServletCofig{

ServletContext context;

public ServletConfig(context){

this.context=context;

}

public ServetContxt getServletContext(){

return;

}

}

ServletConfig config = new ServletConfig(context);

public MyServlet extends HttpSevlet{

publlic init(ServletConfig config){

SevletContext context= config. getServletContext();

}

}

10.3 ServletContext的5大作用

1)获取web的上下文路径

java.lang.String getContextPath()

2)获取全局参数

java.lang.String getInitParameter(java.lang.String name)

java.util.Enumeration getInitParameterNames()

3)和域对象相关的

void setAttribute(java.lang.String name, java.lang.Object object)

java.lang.Object getAttribute(java.lang.String name)

void removeAttribute(java.lang.String name)

什么是域对象?

域对象在不同的资源之间来共享数据。保存数据,获取数据。

ServletContext就是我们学习的第一个域对象。

Servlet三个域对象:

ServletContext

HttpServletRequest

HttpSession

4)请求转发的

RquestDispatcher getRequestDispatcher(java.lang.String path)

在servlet跳转页面:

请求重定向:

1)地址栏会发送改变,变成重定向到的地址。

2)可以跳转到项目内的资源,也可以跳转项目外的资源

3)浏览器向服务器发出两次请求,那么就不能使用请求来作为域对象来共享数据。

请求转发:

1)地址栏不会改变。

2)只能跳转到项目内的资源,不能跳转到项目外的资源

3)浏览器向服务器发出一次请求,那么可以使用请求作为域对象共享数据。

5)读取web项目的资源文件

java.lang.String getRealPath(java.lang.String path)

java.io.InputStream getResourceAsStream(java.lang.String path)

java.net.URL getResource(java.lang.String path)

  1. package day09Servlet.cn.jxufe.f_context;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. /*
  12. * 【context对象的作用1】-获取web上下文路径
  13. */
  14. public class ContextDemo1 extends HttpServlet {
  15.  
  16. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. /**
  18. * 获取web上下路径
  19. */
  20. // 1.1.获取ServletContext对象
  21. // ServletContext context = this.getServletConfig().getServletContext();
  22. /**
  23. * 推荐使用简写
  24. */
  25. ServletContext context = this.getServletContext();
  26. // 1.2 获取
  27. String path = context.getContextPath();
  28. System.out.println(path); ///day09Servlet
  29. /*
  30. * web上下文路径就是项目在tomcat服务器中运行的路径。注意不是开发目录的项目名称。
  31. */
  32. // 请求重定向
  33. // response.sendRedirect("/day09/hello.html");
  34.  
  35. // 作用:可以让这个获取文件的路径更加灵活
  36. response.sendRedirect(context.getContextPath() + "/hello.html");
  37.  
  38. }
  39.  
  40. }

  1. package day09Servlet.cn.jxufe.f_context;
  2.  
  3. import java.io.IOException;
  4. import java.util.Enumeration;
  5.  
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. /*
  13. * 【context对象作用2】-获取全局参数
  14. */
  15. public class ContextDemo2 extends HttpServlet {
  16.  
  17. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. /**
  19. * 得到全局参数
  20. */
  21. ServletContext context = this.getServletContext();
  22.  
  23. System.out.println(context.getInitParameter("AAA"));
  24.  
  25. // 遍历所有参数
  26. Enumeration<String> enums = context.getInitParameterNames();
  27. while (enums.hasMoreElements()) {
  28. String paramName = enums.nextElement();
  29. String paramValue = context.getInitParameter(paramName);
  30. System.out.println(paramName + "=" + paramValue);
  31. }
  32. }
  33.  
  34. }

  1. package day09Servlet.cn.jxufe.g_scope;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. public class ScopeDemo1 extends HttpServlet {
  14.  
  15. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. /**
  17. * 把数据存储到ServletContext域对象
  18. */
  19. ServletContext context = this.getServletContext();
  20. // context.setAttribute("name", "eric");
  21. List<String> list = new ArrayList<>();
  22. list.add("eric");
  23. list.add("jacky");
  24. list.add("rose");
  25. context.setAttribute("list", list);
  26. System.out.println("保存成功");
  27. }
  28.  
  29. }
  1. package day09Servlet.cn.jxufe.g_scope;
  2.  
  3. import java.io.IOException;
  4. import java.util.List;
  5.  
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class ScopeDemo2 extends HttpServlet {
  13.  
  14. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. /**
  16. * 从ServletContext域对象中取出数据
  17. */
  18. ServletContext context = this.getServletContext();
  19. // String name = (String)context.getAttribute("name");
  20. List<String> list = (List<String>) context.getAttribute("list");
  21.  
  22. System.out.println(list);
  23. }
  24.  
  25. }

  1. package day09Servlet.cn.jxufe.h_forward_redirect;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.RequestDispatcher;
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. /*
  13. * 【context对象作用4】--请求转发
  14. */
  15. public class ForwardDemo1 extends HttpServlet {
  16.  
  17. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. /*
  19. * 转发:服务器行为
  20. */
  21.  
  22. // ServletContext context = this.getServletContext();
  23. // RequestDispatcher rd = context.getRequestDispatcher("/hello.html");
  24. // rd.forward(request, response);
  25. /**
  26. * 注意:转发只能转发都当前项目的资源
  27. */
  28. // this.getServletContext().getRequestDispatcher("../bbs/adv.html").forward(request,
  29. // response);
  30. /**
  31. * 把数据保存到request域对象
  32. */
  33. request.setAttribute("name", "jacky");
  34.  
  35. // this.getServletContext().getRequestDispatcher("/GetDataServlet").forward(request, response);
  36.  
  37. /**
  38. * 简写方式
  39. */
  40. request.getRequestDispatcher("/GetDataServlet").forward(request, response);
  41. }
  42.  
  43. }
  1. package day09Servlet.cn.jxufe.h_forward_redirect;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class RedirectDemo2 extends HttpServlet {
  11.  
  12. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. /**
  14. * 请求重定向(浏览器行为)
  15. */
  16. // response.sendRedirect("/day09Servlet/hello.html");
  17.  
  18. /*
  19. * 注意:
  20. * 可以跳转到当前项目的资源,也可以跳转到其他项目的资源
  21. */
  22. // response.sendRedirect("/bbs/adv.html");
  23. /**
  24. * 把数据保存到request域对象
  25. */
  26. request.setAttribute("name", "jacky");
  27.  
  28. response.sendRedirect("/day09Servlet/GetDataServlet");
  29.  
  30. }
  31.  
  32. }

  1. package day09Servlet.cn.jxufe.h_forward_redirect;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. /*
  11. * 路径问题
  12. * 服务器行为 / 代表从当前项目的根目标开始
  13. * 浏览器行为 / 代表从当前站点的根目录开始
  14. */
  15. public class PathDemo extends HttpServlet {
  16.  
  17. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. // 目标地址: hello.html
  19. /**
  20. * 转发
  21. */
  22. // request.getRequestDispatcher("/hello.html").forward(request,
  23. // response);
  24.  
  25. /**
  26. * 重定向
  27. */
  28. // response.sendRedirect("/day09Servlet/hello.html");
  29.  
  30. /**
  31. * html页面的超链接
  32. */
  33. response.getWriter().write("<a href='/day09Servlet/hello.html'>link</a>");
  34.  
  35. /**
  36. * html页面的表单的action
  37. */
  38. response.getWriter().write("<form action='/day09Servlet/hello.html'><input type='submit'/></form>");
  39. }
  40.  
  41. }

  1. package day09Servlet.cn.jxufe.i_ziyuan;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.Properties;
  6.  
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. /*
  13. * 【context对象作用5】--读取web项目的资源文件
  14. */
  15. public class Ziyuan extends HttpServlet {
  16.  
  17. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. /**
  19. * 复习: 读取Properties文件?
  20. */
  21. /**
  22. * 相对路径:
  23. * 当前路径相对于java命令运行的目录
  24. * 结论:
  25. * 在web项目中,java命令运行的目录就是在tomcat的bin目录。在web项目,不能使用相对路径
  26. */
  27. /**
  28. FileInputStream in = new FileInputStream("./src/news.properties");
  29. //1)使用Properteis对象
  30. Properties prop = new Properties();
  31. //2)使用load方法加载properties文件
  32. prop.load(in);
  33. //3)通过getProperty()获取内容
  34. System.out.println(prop.getProperty("name"));
  35. System.out.println(prop.getProperty("password"));
  36. */
  37.  
  38. /**
  39. * 1)getRealPath() 获取资源文件的真实路径
  40. */
  41. String path = this.getServletContext().getRealPath("/WEB-INF/classes/news.properties");
  42. System.out.println(path);
  43.  
  44. /**
  45. * 2)getResourceAsStream() 获取资源文件的输入流
  46. */
  47. InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/news.properties");
  48.  
  49. /**
  50. * 3)getResource() 获取资源文件的URL
  51. */
  52. // URL url =
  53. // this.getServletContext().getResource("/WEB-INF/classes/news.properties");
  54.  
  55. // FileInputStream in = new FileInputStream(new File(path));
  56. // 1)使用Properteis对象
  57. Properties prop = new Properties();
  58. // 2)使用load方法加载properties文件
  59. prop.load(in);
  60. // 3)通过getProperty()获取内容
  61. System.out.println(prop.getProperty("name"));
  62. System.out.println(prop.getProperty("password"));
  63. }
  64.  
  65. }

08Servlet的更多相关文章

  1. 10分钟学会前端调试利器——FireBug

    概述 FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件.它可以用于调试JavaScript.查看DOM.分析CSS.监控网络流量以及进行Ajax交互等.它提供了几乎前 ...

  2. 第八章 Servlet概述

    第八章 Servlet概述 主要内容: 了解servlet: 掌握servlet实现: 掌握servlet的生命周期. servlet概念 Servlet是运行在服务器端用Java语言编写的应用程序, ...

随机推荐

  1. C# 很久以前几个常用类

    Base64加密解密 using System; using System.Collections.Generic; using System.Linq; using System.Text; nam ...

  2. bytesToSize

    export function bytesToSize(bytes){ if (bytes === 0) return '0 B' let k = 1024, // or 1000 sizes = [ ...

  3. vim输入操作

    在英文状态下按下 键盘上的 ”I“ 使用下箭标移动光标到最下面一行,然后按下END键,按下ENTER键 输入你的内容 按下ESC键,然后输入冒号,即 (:wq) 输入保存流程结束

  4. qbzt day3 上午

    内容提要 堆 lca(最近公共祖先) st表 hash 并查集 树状数组 线段树 数据结构 1.堆 Priority_queue 他滋兹:插入删除查询最大值(最小值) 分为大根堆小根堆 2.LCA 首 ...

  5. 用Vue来实现音乐播放器(十五):处理得到的歌手数据

    之前得到的歌手数据是用forEach遍历添加的  没有顺序性  我们希望得到的数据是title:"热门"的数据在最上面  title为字母的数据按字母从低到高顺序排列 var ho ...

  6. JS在页面输出九九乘法表

    <!--小练习,练习使用循环实现一个九九乘法表 第一步,最低要求:在Console中按行输出 n * m = t 然后,尝试在网页中,使用table来实现一个九九乘法表 --> <! ...

  7. pom.xml文件设置

    一个相对完整的maven配置文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  8. Delphi MlSkin V1.1 发布啦! 它能让你的程序拥有像QQ一样多彩炫丽的外观!

    http://bbs.csdn.net/topics/390740239 本帖最后由 u014161811 于 2014-03-24 09:46:40 编辑 QQ皮肤透明TEdit透明TMemo图片按 ...

  9. hbase迁移快照ExportSnapshot时遇到的错

    1.Cannot allocate memory 报错信息: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x ...

  10. VS2012发布Web应用程序

    一.右键项目-->发布 二.配置文件:新建-->配置文件名称,如MyProject 三.连接:1.发布方法:文件系统  2.目标位置:自己在本地建立一个文件夹 3.目标URL:可以不填 四 ...