JavaEE中级.20190605.第一个Servlet(二)的实现.常用形式.请求转发.request域对象.数据响应

一.第一个Servlet的实现

      1.方式一:新建Servlet    继承HttpServlet类
           ①新建普通java类
           ②继承HttpServlet类
           ③重写service()方法
           ④配置web.xml文件,设置servlet对外访问 路径

package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {

		System.out.println("Servlet01的创建....");
	}	
}

      2.方式二:继承GenericServlet类
          ①新建普通java类
          ②继承GenericServlet类
          ③重写service()方法
          ④配置web.xml文件,设置servlet对外访问 路径

package com.shsxt.servlet;

import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

@SuppressWarnings("serial")
public class Servlet02 extends GenericServlet {

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("Servlet02.....");
	}

}

      3.方式三:实现Servlet接口
         ①新建普通java类
         ②实现Servlet接口
         ③重写service()方法
         ④配置web.xml文件,设置servlet对外访问 路径    

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Servlet03 implements Servlet {

	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("Servlet03....");
		
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

      4.Servlet的生命周期
         实例和初始化时机
                当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会
                创建实例并 进行初始化。
                就绪/调用/服务阶段
                有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在
                整个声明周 期中可以被多次调用;
                HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认

          情况下,会抛出异常,需要子类去 override。
                 销毁时机
                 当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。
                上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 有三个生命周 期方法,不由用户手动调用,

           而是在特定的时机有容器自动调用,
                  观察这三个生命周期方法 即可观察到 Servlet 的生命周期。

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet04 extends HttpServlet {

	/**
	 * 初始化,服务器方式,由服务器调用
	 * 	只会调用一次,当第一次请求时
	 * 	当请求到达servlet时,servlet容器会判断该实例是否存在,如果不存在,才会调用该方法
	 */
	@Override
	public void init() throws ServletException {
		System.out.println("Servlet04  init....");
	}
	
	/**
	 * 服务/调用方法,服务器方式,由服务器调用
	 * 	可以调用多次,每次请求到达时都会调用
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet04...");
	}

	/**
	 * 销毁方法,服务器方式,由服务器调用
	 * 	只会调用一次,容器关闭时(正常关闭时才会打印)
	 */
	@Override
	public void destroy() {
		System.out.println("Servlet04 destroy...");
	}

}

      5. Servlet的配置
          ①初始化参数
              设置在web.xml中的servlet标签中
               <init-param>
                   <param-name><param-/name>
                   <param-value></param-value>
               </init-param>
         ②自启动(服务器启动时自动实例化servlet)
            设置在web.xml中的servlet标签中,要写在init-param标签之后
            <load-on-startup>1</load-on-startup>
             值越小,优先级越高
          ③servlet配置多个访问路径
              以Servlet05为例:
              a. 只设置一个路径
                  <url-pattern>/ser05</url-pattern>
              b.设置多个路径
                   <url-pattern>/ser05</url-pattern>
                  <url-pattern>/ser005</url-pattern>
              c.以指定路径开头的所有资源路径
                   <url-pattern>/test/*</url-pattern>
              d.以指定后缀结尾的所有资源路径
                  <url-pattern>*.html</url-pattern>
              e.所有路径都可以访问
                   <url-pattern>*</url-pattern>
              通配符"*"
                  ①"*"只能放在最前面或者最后面,不能放在中间,不能单独使用,不能和字母拼接
                  ②值越精准,优先级越高

package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		System.out.println("Servlet05....");
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// 得到指定名称的的初始化的值
		String encode = config.getInitParameter("encode");
		System.out.println(encode);
		
	}
	
}

二.常用形式

       1.常用方法

      

      2.获取请求头

        

       3.获取客户端请求参数(客户端提交的数据)

        

package com.shsxt.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet01.....");
		
		System.out.println("==============常用方法============");
		// 获取请求的完整路径 (从http到"?"前面)
		String url = request.getRequestURL() + "";
		System.out.println("获取请求的完整路径:" + url);
		// 获取请求的部分路径 (从端口后"?"前面)
		String uri = request.getRequestURI();
		System.out.println("获取请求的部分路径:" + uri);
		// 获取请求的参数字符串 (从"?"开始到最后)
		String queryString = request.getQueryString();
		System.out.println("获取请求的参数字符串:" +queryString);
		// 获取请求类型  (GET/POST)
		String method = request.getMethod();
		System.out.println("获取请求类型:" + method);
		// 获取请求协议版本
		String p = request.getProtocol();
		System.out.println("获取请求协议版本:" + p);
		// 获取站点名
		String contextPath = request.getContextPath();
		System.out.println("获取站点名:" + contextPath);
		
		System.out.println("===========获取请求头==========");
		// 获取指定请求头
		String host = request.getHeader("host");
		System.out.println("Host:" + host);
		// 获取所有请求头的名称枚举集合
		Enumeration<String> enumeration = request.getHeaderNames();
		while(enumeration.hasMoreElements()) {
			System.out.println(enumeration.nextElement());
		}
		
		System.out.println("==========获取请求的参数===========");
		// 获取指定名称的参数值
		String uname = request.getParameter("uname");
		String upwd = request.getParameter("upwd");
		System.out.println("用户名:" + uname + ",用户密码:" +upwd);
		// 获取指定名称的参数的所有值
		String[] hobbys = request.getParameterValues("hobby");
		// 判断并遍历
		if (hobbys != null && hobbys.length > 0) {
			for (String hobby : hobbys) {
				System.out.println("爱好:" + hobby);
			}
		}
	
	}
}

三.请求转发

       request.getRequestDispatcher(url).forward(request, response);

      ①服务器行为,服务器行为
      ②地址栏不会发生改变
      ③只有一次请求,request对象共享

package com.shsxt.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet03....");
		
		// 获取参数
		String uname = request.getParameter("uname");
		System.out.println("Servlet03:" + uname);
		
		// 请求转发跳转到指定页面
		// request.getRequestDispatcher("index.html").forward(request, response);
		
		// 请求转发跳转到指定servlet
		request.getRequestDispatcher("ser04").forward(request, response);	
	}	
}
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 请求转发
 * 	request.getRequestDispatcher(url).forward(request, response);
 * @author Lisa Li
 *
 */
@SuppressWarnings("serial")
public class Servlet04 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet04....");
		
		// 获取参数
		String uname = request.getParameter("uname");
		System.out.println("Servlet04:" + uname);
				
	}	
}

四.request域对象
     将数据存到request作用域中,前台页面(JSP)从作用域中获取域对象的值     
     setAttribute(name,value):设置作用域,name是字符串类型,value是object类型
     getAttribute(name):获取指定名称的域对象的值,返回的是object类型
     removeAttribute(name):移除指定名称的域对象的值

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet05....");
		
		// setAttribute(name,value):设置作用域,name是字符串类型,value是object类型
		request.setAttribute("userName", "Lisa");	
		
		// 请求转发跳转到index.jsp
		request.getRequestDispatcher("index.jsp").forward(request, response);

	}	
}

五.数据响应

      getWriter()获取字符流(只能响应回字符);
      getOutputStream()获取字节流(能响应一切数据)。
      响应回的数据到客户端被浏览器解析。
      注意:两者不能同时使用。
               java.lang.IllegalStateException: getWriter() has already been called for this response

package com.shsxt.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet02 extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet02...");
		
		// 设置响应类型  默认是纯文本
		response.setContentType("text/html");
		// 得到输出流  字符输出流
		/*PrintWriter writer = response.getWriter();
		writer.write("Hello");
		writer.write("<h3>Hello</h3>");
		writer.close();*/
		// 得到字节输出流
		ServletOutputStream out = response.getOutputStream();
		out.write("Hello".getBytes());
		out.write("<h3>Hello</h3>".getBytes());
		out.close();
		
	}
}

       getWriter()获取字符流(只能响应回字符);
       getOutputStream()获取字节流(能响应一切数据)。
       响应回的数据到客户端被浏览器解析。
       注意:两者不能同时使用。

package com.shsxt.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet03...");
		
		// 设置响应类型  默认是纯文本
		/*response.setContentType("application/json");
		String json = "{\"uanme\":\"zhangsan\",\"upwd\":\"123\"}";
		// 得到输出流  字符输出流
		PrintWriter writer = response.getWriter();
		writer.write(json);
		writer.close();*/
		response.setContentType("text/html");
		String form = "<form action='ser02' method='get'> userName: <input type='text' name='uname' /> <br/> userPwd: <input type='password' name='upwd' /> <br/> <input type='submit' value='Login' /> </form>";
		// 得到输出流  字符输出流
		PrintWriter writer = response.getWriter();
		writer.write(form);
		writer.close();			
	}	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值