JAVA WEB---Servlet

package JavaWebServlet01;

import java.io.IOException;
import java.util.Date;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//想要开发一个Servlet只需要两个步骤:
//(1)写一个类实现javax.servlet接口。
//(2)在web.xml中为servlet配置对外访问路径。

//------------------(1)写一个类实现javax.servlet接口------------------------------
//-------------------------Servlet------------------------------------
/*
   重要方法 init()  destroy() service()
   
  1.init(ServletConfig config)
  		初始化方法,会在Servlet被创建出来后立即执行,做一些初始化的工作
  2.destroy()
		销毁方法,会在Servlet被销毁之前执行,做一些善后工作
		
  3.service(ServletRequest req, ServletResponse res)
		服务方法,每当有请求访问Servlet时,此方法执行,处理请求的代码要写到这个方法里。
		
  还有其他方法
  getServletConfig()方法来获取ServletConfig对象,ServletConfig对象可以获取到Servlet的一些信息
  
 */

//---------------------GenericServlet----------------------------------
/*
   GenericServlet是个抽象类,实现了Servlet接口中的大部分方法,
    唯独service方法没有做实现,我们继承GenericServlet需要实现这个Service方法在其中写处理请求的代码。
   
   service方法有两个参数,ServletRequest代表HTTP请求,ServletResponse代表HTTP响应,
   ServletRequest:获取客户端发送过来的信息
   ServletResponse:需要向客户端发送数据
 */



//-----------------------HttpServlet--------------------------------------
/*
  主要是应对Http请求所开发的Servlet
  
  HttpServlet继承自GenericServlet类,实现了其中的service抽象方法,
   在service方法中,对request和response进行强转,转成对应的Http类型,然后调用本类定义的serivce(HttpServletRequest,HttpServletResponse)
   				     本类定义service方法中,先获取用户实际的请求方式,然后根据请求方式,调用对应的doXXX()
   
   
  程序员仅需要继承HttpServlet,在对应的doXXX方法中添加实际的应答逻辑即可
   通常我们在开发Servlet时,直接继承HttpServlet覆盖对应的doGet()doPost()方法即可,一般不推荐直接覆盖service()方法。
   
   	当客户端用get方式访问该Servlet时会导致doGet()方法执行
	当客户端用post方式访问该Servlet时会导致doPost()方法执行

	可以在doPost{doGet(request, response);}调用doGet,然后将处理代码写在doGet中。这样处理代码对于get方式的请求和post方式的请求的处理是相同的情况下,无论是get还是post请求都可以进行处理了。
 */



//--------------------(2)在web.xml中为servlet配置对外访问路径。--------------------------------------
/*
  ----------------------------------Servlet对外访问路径配置细节---------------------------------------
  1.
  web.xml
  <!--1.<servlet>标记加子标记  配置Servlet -->
  <!--1.1子标记 <servlet-name>创建servlet对象的名字 且保证不能相同  -->
  <!--1.2子标记 <servlet-class>配置的Servlet类的全路径名  -->
  
  <servlet>
     <servlet-name>firstServlet</servlet-name>
     <servlet-class>JavaWebServlet01.Servlet01</servlet-class>     <!--JavaWebServlet01.Servlet01有JavaWebServlet01.Servlet01是因为FinaEmpServlet.java上级文件有package叫JavaWebServlet01  -->
  </servlet>
  
  
 <!--2.<servlet-mapping>标记加子标记 配置该Servlet的对外访问路径   <servlet>与<servlet-mapping>配套使用 -->
 <!--2.1子标记 <servlet-name>创建servlet对象的名字 与  <servlet>的<servlet-name>名字一样  -->
 <!--2.2子标记 <url-pattern> 指定用户用怎样的URL格式请求servlet对象  例如其为/servlet/firstServlet  浏览器输入http://localhost/day009JavaWebServlet[web应用名]/servlet/firstServlet[servlet名]就可访问 -->
  
  <servlet-mapping>
    <servlet-name>firstServlet</servlet-name>
    <url-pattern>/servlet/Servlet01</url-pattern>
  </servlet-mapping>
  
                                            
    2.                                    
 	Servlet映射URl
 		一对一的映射
 		一个Servlet映射多个Url      
 						以/开头,以/*结尾	  /servlet/*
 						*.do                   a.do
 						
 						可能造成一个url可以对应多个Servlet,这种情况下,需要遵循的规则
 									1.哪个最像找哪个
 									2. *.后缀的优先级永远是最低的
 	
 	3.缺省Servlet
		路径中有一个特殊的配置“/”,如果一个servlet的对外访问路径被设置为/,则该servlet就是一个缺省servlet,其他servlet不处理的请求都由它来处理。
		不建议
 */

//输入http://localhost/day009JavaWebServlet[web应用名]/servlet/Servlet01[servlet名]
//浏览器会输出每次获取的动态时间
public class Servlet01  extends GenericServlet{

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String data=new Date().toLocaleString();
		arg1.getWriter().write("time:"+data);    //ServletResponse.getWriter().write()   通过这个方法获取流就可以将数据发送给浏览器
	}

}
package JavaWebServlet01;

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;

//-----------------------HttpServlet--------------------------------------
/*
主要是应对Http请求所开发的Servlet

HttpServlet继承自GenericServlet类,实现了其中的service抽象方法,
 在service方法中,对request和response进行强转,转成对应的Http类型,然后调用本类定义的serivce(HttpServletRequest,HttpServletResponse)
 				     本类定义service方法中,先获取用户实际的请求方式,然后根据请求方式,调用对应的doXXX()
 
程序员仅需要继承HttpServlet,在对应的doXXX方法中添加实际的应答逻辑即可
 通常我们在开发Servlet时,直接继承HttpServlet覆盖对应的doGet()doPost()方法即可,一般不推荐直接覆盖service()方法。
 
 	当客户端用get方式访问该Servlet时会导致doGet()方法执行
	当客户端用post方式访问该Servlet时会导致doPost()方法执行

	可以在doPost{doGet(request, response);}调用doGet,然后将处理代码写在doGet中。这样处理代码对于get方式的请求和post方式的请求的处理是相同的情况下,无论是get还是post请求都可以进行处理了。
*/



public class Servlet03 extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the GET method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}
package JavaWebServlet01;

import java.io.IOException;

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

//-----------------------HttpServlet--------------------------------------
/*
 	HttpServlet继承自GenericServlet类,在GenericServlet类的基础上对HTTP协议进行了优化。
 	通常我们在开发Servlet时,直接继承HttpServlet覆盖对应的doGet()doPost()方法即可,一般不推荐直接覆盖service()方法。
 
 	
       情况:处理代码对于get方式的请求和post方式的请求的处理是相同的
	解法:可以在doPost{doGet(request, response);}调用doGet,然后将处理代码写在doGet中。
	
	
*/


public class TestServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package JavaWebServlet01;

import java.io.IOException;

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


//Servlet生命周期
/*
 *  1   用户第一次请求该Servlet映射的Url时,web容器负责加载该Servlet的class文件,创建该Servlet的实例,调用1.init()方法执行初始化
	2	从此以后该对象一直驻留在内存中为后续的对这个Servlet的请求进行服务2.Service()。
	3	直到服务器关闭或web应用移除出容器时,随着web应用的销毁Servlet对象销毁掉,在销毁之前调用3.destory()方法执行善后工作。
	4	在存活期间,每次对Servlet 的调用都会导致Service方法的执行。
 */


//1.开启tomcat,输入localhost/day009JavaWebServlet/servlet/Servlet04请求
//servlet被请求,创建
//Servlet被初始化init()
//Servlet正在服务service()


//2.再次输入localhost/day009JavaWebServlet/servlet/Servlet04请求
//Servlet正在服务service()

//3.停止tomcat服务器或将该web移除web容器
//Servlet在销毁之前善后处理destroy()



public class Servlet04 extends HttpServlet {
   static{
	   System.out.println("servlet被请求,创建");
   }


   @Override
   public void init() throws ServletException {
	   // TODO Auto-generated method stub
	   System.out.println("Servlet被初始化init()");
   }
   
	@Override
	public void destroy() {
			// TODO Auto-generated method stub
			System.out.println("Servlet在销毁之前善后处理destroy()");
	}
   

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		  System.out.println("Servlet正在服务service()");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package JavaWebServlet01;

import java.io.IOException;

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

/*
 * Request
  		概念:代表了用户的一次请求,每个Request对象中封装了用户本次请求的全部信息
  		继承关系: ServletRequest(父类)
  				 HttpServletRequest(子类):继承了ServletRequest,增加了处理Http请求相关的一些方法
 */

/*
 
   1.Request获取客户机信息

    getRequestURL方法 -- 返回客户端发出请求完整URL
	getRequestURI方法 -- 返回请求行中的资源名部分
	getQueryString方法 -- 返回请求行中的参数部分
	getRemoteAddr方法 -- 返回发出请求的客户机的IP地址
	getMethod方法 -- 返回客户机的请求方式
	getContextPath方法 -- 获得当前web应用的虚拟目录名称
 */

//浏览器输入http://localhost/day009JavaWebServlet/servlet/Request01访问      http://localhost/(web项目名称)/servlet/(Servlet名称)
public class Request01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1.getRequestURL方法 -- 返回客户端发出请求完整URL
		String url=request.getRequestURL().toString();
		System.out.println("url:"+url);                     //输出url:http://localhost/day009JavaWebServlet/servlet/Request01
		
       //2.getRequestURI方法 -- 返回请求行中的资源名部分
	  String uri=request.getRequestURI().toString();
	  System.out.println("uri:"+uri);					   //输出uri:/day009JavaWebServlet/servlet/Request01

	  //3.getQueryString方法 -- 返回请求行中的参数部分
	  String QueryString=request.getQueryString();
	  System.out.println("QueryString:"+QueryString);		//输出QueryString:null 可以在url后拼接?name='szh'&age=18 输出QueryString:name=%27szh%27&age=18
	  
	  //4.getRemoteAddr方法 -- 返回发出请求的客户机的IP地址
	  String RemoteAddr=request.getRemoteAddr();
	  System.out.println("RemoteAddr:"+RemoteAddr);        //输出RemoteAddr:127.0.0.1
	  
	  
	  //5.getMethod方法 -- 返回客户机的请求方式
	  String Method=request.getMethod();
	  System.out.println("Method:"+Method);               //输出Method:GET
	  
	  //---重要---
	  //6.getContextPath方法 -- 获得当前web应用的虚拟目录名称
	  String ContextPath=request.getContextPath();
	  System.out.println("ContextPath:"+ContextPath);  //输出ContextPath:/day009JavaWebServlet
	  
	  
	  
	  
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package JavaWebServlet01;

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;


/*
        2.Request获取请求头信息
        
        
		getHeader(name)方法 --- String                        获取对应请求头的值
		getHeaders(String name)方法 --- Enumeration<String>   返回对应请求头的所有的值
		getHeaderNames()方法 --- Enumeration<String>          获取用户传来的所有请求头的name
		getIntHeader(name)方法  --- int						  返回值是int类型
		getDateHeader(name)方法 --- long(日期对应毫秒)		  返回值是long类型
		
		
		
 */
public class Request02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		
		//1. Enumeration<String>=request.getHeaderNames()获取用户传来的所有请求头的name
		Enumeration<String> names=request.getHeaderNames();
		while(names.hasMoreElements()){
			//移动指针,返回请求头的name
			String name=names.nextElement();
			//2.String=request.getHeader(name)获取对应请求头的value 
			System.out.println(name+":"+request.getHeader(name));   
			/**
			 ** 
			 * 输出host:localhost
					connection:keep-alive
					cache-control:max-age=0
					user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400
					upgrade-insecure-requests:1
					accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,;q=0.8
					accept-encoding:gzip, deflate, br
					accept-language:zh-CN,zh;q=0.9
             *
			 */

		}
		
		
		

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package JavaWebServlet01;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;

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

/*
 * 
 * 		3.Request获取请求参数和乱码解决

		getParameter(String name) -- String 通过name获得值
		getParameterValues(String name) -- String[] 通过name获得多值 如: 爱好
		getParameterNames() -- Enumeration<String> 获得所有请求参数的name
		getParameterMap() -- Map<String,String[ ]> key :name    value: 多值
 */

//输入http://localhost/day009JavaWebServlet/param.html
public class Request03 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//设定服务器解析 请求实体 时使用的字符集,该方法应该放在 请求实体 中获取数据之前调用
		//请求实体是post使用,而get将参数拼接在地址栏之后,所以该方法只对post乱码有效
		//这个问题在tomcat8当中已经修复 
		//request.setCharacterEncoding("utf-8");
		
		
		//1.getParameter(String name) -- String             通过name获得值
		String username=request.getParameter("username");
		
		//客户端发送时使用的是utf-8编码而服务器用iso8859-1解码造成了乱码,虽然字符已经乱掉了,但底层的字节仍然是正确的,
		//我们只要将乱码字符 getBytes(“iso8859-1”)转换为字节,就是正确的字节
		//再将这些字节new String(bytes,“utf-8”)按照正确的码表编码,就可以转换回正确的字符了,从而解决了乱码。
		
		//---------------------在get修复乱码问题-----------------------------------
		byte[] bytes=username.getBytes("iso8859-1");                 //将乱码字符 getBytes("iso8859-1")转换为字节,就是正确的字节
		username=new String(bytes,"utf-8");							//将这些字节new String(bytes,"utf-8")按照正确的码表编码,就可以转换回正确的字符
		
		String nickname=new String(request.getParameter("nickname").getBytes("iso8859-1"),"utf-8");
		
		
		System.out.println("username:"+username);
		System.out.println("nickname"+nickname);
	}

	
	
	
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//设定服务器解析 请求实体 时使用的字符集,该方法应该放在 请求实体 中获取数据之前调用
		//请求实体是post使用,而get将参数拼接在地址栏之后,所以该方法只对post乱码有效
		//这个问题在tomcat8当中已经修复
		
		//---------------------在post修复乱码问题-----------------------------------
		request.setCharacterEncoding("utf-8");              
		
		//1.getParameter(String name) -- String             通过name获得值
		String username=request.getParameter("username");
		String nickname=request.getParameter("nickname");
		System.out.println("username:"+username);
		System.out.println("nickname"+nickname);
		
		System.out.print("like:");
		//2.getParameterValues(String name) -- String[]    通过name获得多值 如: 爱好
		String[] likes=request.getParameterValues("like");
		if(likes!=null){                    //首先判断是否为空,可能用户传过来的没选择爱好
			for(String a:likes){
				System.out.print(a+",");
			}
		}
		System.out.println();
		
		//3.getParameterMap() -- Map<String,String[ ]>    key :name    value: 多值
		Map<String,String[]> map=request.getParameterMap();
		for(Entry<String,String[]> entry:map.entrySet()){
			String name=entry.getKey();            //获取Map键值对的key
			System.out.print("name="+name+",values=");
			String[] values=entry.getValue();	   //获取Map键值对的value
			if(values!=null){
				for(String v:values)
				System.out.print(v+",");
			}
		}
		//输出name=username,values=我是王企鹅王
		//	  name=nickname,values=asdssaddas,
		//    name=like,values=lanqiu,taiqiu,
	}

}

猜你喜欢

转载自blog.csdn.net/WuYunCode/article/details/81608948