zoukankan      html  css  js  c++  java
  • Web阶段:第八章:Servlet上

    Servlet技术
    a)什么是Servlet
    1、Servlet是一个接口(JavaEE规范)
    2、Servlet是运行在服务器(Tomcat或其他的服务器)上的小程序。
    3、Servlet程序用来接收用户的请求,和给客户端响应数据。(接收请求,回传响应)

    b)手动实现Servlet程序
    1、编写一个类去实现Servlet接口
    2、实现接口中的service方法
    3、到web.xml中去配置访问地址

    Servlet程序

    public class HelloServlet implements Servlet {
    	@Override
    	public void service(ServletRequest arg0, ServletResponse arg1)
    			throws ServletException, IOException {
    		System.out.println("hello world!!");
    	}
    }
    

    web.xml中的配置:

       <!-- 
        servlet配置一个Servlet程序,给Tomcat服务器配置
        -->
        <servlet>
        	<!-- servlet-name给这个servlet启一个名称,一般值是类名 -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-name是Servlet程序的全类名 -->
        	<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
        </servlet> 
        <!-- servlet-mapping用来配置servlet程序的访问地址 -->
        <servlet-mapping>
        	<!-- servlet-name表示给谁配置访问地址 -->
        <servlet-name>HelloServlet</servlet-name>
     <!-- 
    url-pattern配置访问地址
    地址的格式:http://ip:port/工程名/资源名		
    在服务器上。/ 斜杠 == 表示地址:http://ip:port/工程名/		
    /hello ====== 表示http://ip:port/工程名/hello		
    也就是说,我们在浏览器地址栏上输入访问地址:
    http://ip:port/工程名/hello 就可以访问这个HelloServlet程序。
    如果将项目部署到服务器上默认访问的是index.html,如果没有index文件则会报错
    -->	
        	<url-pattern>/hello</url-pattern>
        </servlet-mapping>
    

    常见错误: servlet-name标签配置不统一
    在这里插入图片描述
    常见错误二:servlet-class标签全类名标签错误
    在这里插入图片描述
    常见错误三:url-pattern没有以斜杠打头
    在这里插入图片描述
    c)解析url到servlet访问细节
    在这里插入图片描述
    d)Servlet的生命周期(了解内容,面试)
    1 先执行Servlet的构造器
    2 执行init初始化方法
    工程启动之后,我们第一次访问Servlet程序的时候执行 1 和 2两个步骤
    3 执行service 业务方法
    每次调用都会执行service方法
    4 执行destroy销毁方法
    当web工程停止的时候(重新部署)

    e)模拟GET请求和POST请求的分发

    public class HelloServlet implements Servlet {
    	/**
    	 * service方法是业务处理方法,每次请求都会调用
    	 */
    	@Override
    	public void service(ServletRequest request, ServletResponse response)
    			throws ServletException, IOException {
    //		System.out.println("3 service业务处理方法");
    		// 想办法知道到底请求进来到底是GET。还是POST
    		HttpServletRequest httpRequest = (HttpServletRequest) request;
    		//getMethod 可以获取请求的方式,GET或POST
    		String method = httpRequest.getMethod();
    		// System.out.println( method );
    		
    		// 可能一般GET请求,和POST请求,需要做的工作不同
    		if ("GET".equals(method)) {
    			// 做GET请求的处理
    			doGet();
    		} else if ("POST".equals(method)) {
    			// 做POST请求的处理
    			doPost();
    		}
    	}
    	
    	public void doGet() {
    		System.out.println("这是GET请求的功能");
    	}
    	
    	public void doPost() {
    		System.out.println("这是POST请求的功能");
    	}
    }
    

    f)通过继承HttpServlet实现Servlet程序
    在开发的时候。为了让开发代码更佳简洁,方便,然后规范中提供了一个类叫HttpServlet类。
    我们只需要继承HttpServlet类,就可以实现Servlet程序了
    1、编写一个类去继承HttpServlet
    2、重写doGet或doPost方法
    3、去web.xml中去配置请求地址
    源代码:

    public class HelloServlet2 extends HttpServlet {
    	/**
    	 * doGet方法,在请求进来 是GET请求的时候,调用
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		System.out.println("这是继承HttpServlet 实现的 GET功能");
    	}
    	/**
    	 * doPost方法,在请求进来 是POST请求的时候,调用
    	 */
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		System.out.println("这是继承HttpServlet 实现的 POST功能");
    	}   
    }
    

    web.xml中的配置:

    <servlet>
    		<servlet-name>HelloServlet2</servlet-name>
    		<servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>HelloServlet2</servlet-name>
    		<!-- 在服务器中 / 斜杠 ===== 表示http://ip:port/工程名/
    			/hello2	===>>>> http://ip:port/工程名/hello2
    		 -->
    		<url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    

    表单:

    <form action="http://localhost:8080/day06/hello2" method="post">
        		<input type="submit" />
    </form>
    

    g)使用Eclipse创建Servlet程序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    Servlet类的继承体系
    在这里插入图片描述
    ServletConfig类
    ServletConfig类从类名中就感觉它是Servlet程序的配置信息。
    这个ServletConfig只能由Tomcat服务器负责创建。每次Tomcat创建Servlet程序的时候,就会创建ServletConfig对象,然后调用init初始化方法进行初始化操作。

    a)ServletConfig类的三大作用
    1、获取在web.xml中配置的Servlet-name的别名
    2、获取在web.xml中配置的初始化参数init-param
    3、获取ServletContext对象

    源代码:

    public class ConfigServlet extends HttpServlet {
    
    	public void init(ServletConfig config) throws ServletException {
    //		1、获取在web.xml中配置的Servlet-name的别名
    		System.out.println("servlet-name的值:" + config.getServletName());
    //		2、获取在web.xml中配置的初始化参数init-param
    		System.out.println("初始化参数user的值:" + config.getInitParameter("user"));
    		System.out.println("初始化参数url的值:" + config.getInitParameter("url"));
    //		3、获取ServletContext对象
    		System.out.println( config.getServletContext() );
    	}
    
    }
    

    web.xml中的配置:

    <servlet>
        <servlet-name>ConfigServlet</servlet-name>
        <servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
        <!-- 
        	init-param
        		配置配置初始化参数(由键值对组成)
         -->
        <init-param>
        	<!-- param-name是参数名 -->
        	<param-name>user</param-name>
        	<!-- param-value是参数值 -->
        	<param-value>root</param-value>
        </init-param>
        <!-- 
        	init-param
        		配置配置初始化参数(由键值对组成)
         -->
        <init-param>
        	<!-- param-name是参数名 -->
        	<param-name>url</param-name>
        	<!-- param-value是参数值 -->
        	<param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>ConfigServlet</servlet-name>
        <url-pattern>/configServlet</url-pattern>
      </servlet-mapping>
    

    注意点:
    在这里插入图片描述
    在这里插入图片描述
    ServletContext类
    a)什么是ServletContext?
    1、ServletContext是一个接口
    2、ServletContext在一个web工程中只有一个对象实例(Tomcat服务器负责创建)。
    3、ServletContext是一个域对象。

    什么是域对象?
    域对象是可以像map一样存取数据的对象
    setAttribute 保存数据 put
    getAttribute 获取数据 get
    removeAttribute 删除数据 remove
    域指的是这些存取的数据的操作范围。ServletContext对象的数据操作范围是整个web工程。
    ServletContext对象在web工程启动的时候创建。在web工程停止的时候销毁。

    b)ServletContext类的四个作用
    1、获取在web.xml中配置的上下文初始化参数 context-param
    2、获取工程路径地址
    3、获取工程发布之后在服务器上的绝对路径
    4、像map一样存取数据。

    ServletContext作用的演示源代码:

    public class ContextServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		//获取ServletContext对象
    		ServletContext servletContext = getServletContext();		
    //		1、获取在web.xml中配置的上下文初始化参数	context-param
    		String password = servletContext.getInitParameter("password");
    		String url = servletContext.getInitParameter("url");
    		System.out.println( "上下文参数password的值:" + password );
    		System.out.println( "上下文参数url的值:" + url );
    //		2、获取工程路径地址
    		System.out.println("当前工程路径是:" + servletContext.getContextPath());
    //		3、获取工程发布之后在服务器上的绝对路径
    		// / 斜杠表示到http://ip:port/工程名/	映射到代码的webContent目录	
    		// getRealPath 获取在服务器上的绝对路径。
    		System.out.println( "/ 根 的绝对路径是:" + servletContext.getRealPath("/") );
    		System.out.println("/css的绝对路径是:" + servletContext.getRealPath("/css"));
    		System.out.println("/imgs/11.jpg的绝对路径是:" + servletContext.getRealPath("/imgs/11.jpg"));
    		System.out.println( servletContext.getRealPath("/1.js") );
    	}
    }
    

    web.xml配置文件内容:

    <context-param>
    		<param-name>password</param-name>
    		<param-value>root</param-value>
    	</context-param>
    	<context-param>
    		<param-name>url</param-name>
    		<param-value>jdbc:mysql://localhost:3306/contextServlet</param-value>
    	</context-param>
    

    像map一样存取数据:

    Context1的代码:

    public class Context1 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {	
    		ServletContext context = getServletContext();
    		System.out.println( context );
    		// 获取属性值:
    		System.out.println("在保存属性前 Context1 里获取abc的属性值:" + context.getAttribute("abc"));		
    		context.setAttribute("abc", "麦当劳是谁开的?麦当娜开的!因为他们都姓麦!");	
    		System.out.println("在保存属性后 Context1 里获取abc的属性值:" + context.getAttribute("abc"));
    	}	
    }
    

    Context2的代码:

    public class Context2 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {		
    		ServletContext context = getServletContext();
    		System.out.println( context );
    		// 获取属性值:
    		System.out.println("Context2 里获取abc的属性值:" + context.getAttribute("abc"));
    	}
    }
    
  • 相关阅读:
    【ES6】函数的扩展
    NSFileManger使用介绍
    委托,曾将让我头疼难以理解
    【HDOJ】1914 The Stable Marriage Problem
    MySQL修改配置优化插入性能
    MySQL配置文件的编码问题
    MyBatis批量更新时提示"You have an error in your SQL syntax"
    MyBatis批量更新返回受影响数
    log4j.properties配置说明
    删除Win10的OneDrive
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812111.html
Copyright © 2011-2022 走看看