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,
}
}