笔记整理来源于尚硅谷,仅供本人复习使用,无其它目的
(1)、编写一个类去实现Servlet接口
(2)、实现service方法,处理请求,并响应数据
package JavaWeb;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
//service方法是专门用来处理请求和响应的
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.Service方法:servlet被访问了");
//强制转换为子类HttpServletRequest类型,因为只有子类才有.geiMethod()方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//子类调用.geiMethod()方法,获取请求方式
String method = httpServletRequest.getMethod();
//判断
if ("GET".equals(method)){
doGet();
}else if ("POST".equals(method)){
doPost();
}
}
//做GET请求的操作
public void doGet(){
System.out.println("请求方式为GET请求!!");
System.out.println("请求方式为GET请求!!");
System.out.println("请求方式为GET请求!!");
}
//做POST请求的操作
public void doPost(){
System.out.println("请求方式为POST请求!!");
System.out.println("请求方式为POST请求!!");
System.out.println("请求方式为POST请求!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4.destroy销毁方法");
}
}
(3)、到web.xml中去配置servlet程序的访问地址
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>JavaWeb.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
(1)、执行Servlet构造器方法
public HelloServlet() {
System.out.println("1.构造器方法");
}
(2)、执行init初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.init初始化方法");
}
注意:第(1)、(2)步,是在第一次访问的时候创建Servlet程序会调用。
(3)、执行service方法
//service方法是专门用来处理请求和响应的
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.Service方法:学习JavaWeb的第一天!!");
}
注意:第(3)步,每次访问都会调用。
(4)、执行destroy销毁方法
@Override
public void destroy() {
System.out.println("4.destroy销毁方法");
}
一般在实际项目开发中, 都是使用继承HttpServlet类的方式去实现Servlet程序。
(1)、编写一个类去继承HttpServlet 类
(2)、根据业务需要重写doGet或doPost 方法
public class HelloServlet2 extends HttpServlet {
//重写init方法
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);//必须加上这句,否则无法进入hello2页面,会报404错误,子类重写了父类的init方法,则调用时父类的init方法就会丢失,为了避免丢失则添加super
System.out.println("重写init方法");
}
//get请求调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2的doGet方法!!");
ServletConfig servletConfig = getServletConfig();
System.out.println("获取初始化参数userName的值:"+servletConfig.getInitParameter("userName"));
System.out.println("获取初始化参数url的值:"+servletConfig.getInitParameter("url"));
}
//post请求调用
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2的doPost方法!!");
}
}
(3)、到web.xml中的配置Servlet程序的访问地址
<servlet>
<servlet-name>HelloServlet2servlet-name>
<servlet-class>JavaWeb.HelloServlet2servlet-class>
servlet>
<servlet-mapping>
<servlet-name>HelloServlet2servlet-name>
<url-pattern>/hello2url-pattern>
servlet-mapping>
idea会自动在xml配置文件中创建servlet程序以及在对应的包创建类
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.init初始化方法");
//1.可以获取Servlet程序的别名servlet -namp的值
System.out.println("获得HelloServlet程序的别名是:" + servletConfig.getServletName());
//2.获取初始化参数init-param.
System.out.println("获取初始化参数userName的值:"+servletConfig.getInitParameter("userName"));
System.out.println("获取初始化参数url的值:"+servletConfig.getInitParameter("url"));
//3.获取ServletContext对象
System.out.println("获取ServletContext对象:"+servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>JavaWeb.HelloServletservlet-class>
<init-param>
<param-name>userNameparam-name>
<param-value>rootparam-value>
init-param>
<init-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/testparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
(1)域对象,是可以 像Map一样,存取数据的对象,叫做域对象。
(2)这里的域对象 指的是,存取的数据的操作范围
(3)数据存取
<servlet>
<servlet-name>ContextServletservlet-name>
<servlet-class>JavaWeb.ContextServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>ContextServletservlet-name>
<url-pattern>/contexturl-pattern>
servlet-mapping>
测试代码
public class ContextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1,获取web.xmL中配置的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
System.out.println("上下文参数context-param参数gougege的值是:"+ context.getInitParameter("gougege"));
System.out.println("上下文参数context-param参数gou的值是:"+ context.getInitParameter("gou"));
//2,获取当前的工程路径,格式: /工程路径
System.out.println("当前工程路径:"+context.getContextPath());
//3,获取工程部署后在服务器硬盘上的绝对路径
/*
/ 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录
*/
System.out.println("工程部署后在服务器硬盘上的绝对路径"+context.getRealPath("/"));
}
}
(1)什么是协议?
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
(2)HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议。
(3)HTTP协议中的数据又叫报文。
(1) 客户端给服务器发送数据叫请求。
每次只要有请求进入Tomcat 服务器,Tomcat 服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法( doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
测试代码
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//①getRequestURI() 获取请求的资源路径
System.out.println("URI->:"+req.getRequestURI());
//②getRequestURL() 获取请求的统一-资源定位符(绝对路径)
System.out.println("URL->:"+req.getRequestURL());
//③getRemoteHost() 获取客户端的ip地址
System.out.println("ip->:"+req.getRemoteHost());
//④getHeader() 获取请求头:如浏览器信息UserUser-Agent
System.out.println("请求头User-Agent->:"+req.getHeader("User-Agent"));
//⑤getMethod() 获取请求的方式GET或POST
System.out.println("请求方式->:"+req.getMethod());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("--------post请求---------");
//获取用户名
String username = req.getParameter("username");
System.out.println("用户名:"+username);
//获取密码
String password = req.getParameter("password");
System.out.println("密码:"+password);
//获取兴趣爱好
String[] hobby = req.getParameterValues("hobby");
System.out.println("兴趣爱好:"+ Arrays.asList(hobby));
}
注意:解决post请求的乱码: req.setCharacterEncoding("UTF-8");
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数(办事的材料)
System.out.println("Servlet1(柜台一)查看参数(材料):" + req.getParameter("username"));
//给servlet1盖章,带到servlet2查看(共享)
req.setAttribute("key", "柜台一(servlet1)的章");
//问路去哪:柜台二怎么走(获得请求地址)
/*
请求转发必须要以斜杠打头,/斜杠表示地址为: http://ip:port/工程名/,映射到IDEA代码的web目录
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//跳转(重定向)到servlet2(柜台二)
requestDispatcher.forward(req, resp);
}
}
柜台二
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求的参数(办事的材料)
System.out.println("Servlet2(柜台二)查看参数(材料):"+request.getParameter("username"));
//查看servlet1盖的章(共享)
System.out.println("柜台一是否有章:"+request.getAttribute("key"));
//处理业务
System.out.println("servlet2(柜台二)处理自己的业务!!!");
}
}
base 标签,可以设置当前页面中,所有相对路径工作时,参照哪个路径进行跳转
//修改了服务器的字符集
resp.setCharacterEncoding("UTF-8");
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp.setContentType("text/html;charset=UTF-8");
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html;charset=UTF-8");
(1)第一种方式
//设置响应状态码为302,表示重定向
resp.setStatus(302);
//设置响应头,设置新的的地址
resp.setHeader("Location","http://localhost:8080/0713_Response/response2");
(2)第二种方式
resp.sendRedirect("http://localhost:8080/0713_Response/response2");
访问网址:http://localhost:8080/0713_Response/response1
会跳转到 : http://localhost:8080/0713_Response/response2
(1).Cookie是服务器通知喜户端保存键值对的一种技术.
(2).客户端有了Cooke后,每次请求都发送给服务器。
(3).每个Cookie的大小不能超过4kb
(4).Cookie是服务器中Servlet程序创建并通过response返回给客户端浏览的的键值对信息。
(1) 创建Cookie对象
Cookie cookie = new Cookie("key", "value");
(2) 通知客户端保存Cookie
response.addCookie(cookie);
注意:对于Version 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引景、斜杠、问号、at符号、冒号和分号。空值在所有浏览器上的行为不一定相同。
(1)Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发
(2)path属性是通过请求的地址来进行有效的过滤。
eg:
CookieA 的 path=/工程路径
CookieB 的 path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发送
http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送
(1)Session就是一个接口HttpSession。
(2)在web中Session就一会话,维护一个客户端和服务器之间关联的一种技术。
(3)每个客户端都有自己的Session会话,用来保存用户登陆之后的信息。
Cookie是保存在客户端的,Session是保存在服务器端的
(1)Session的创建与获取
Session的获取和创建的API是一样的
request.getSession():
第一次调用是创建Session会话,之后调用都是获取创建好的Session会话对象。
isNew():
判断到底是不是刚创建出来的(新的)
true表示刚创建
false表示获取之前创建
每个会话都有一个身份证号,ID值(唯一),可以通过getId()获取Session的id值
//设置域数据
request.getSession().setAttribute("key1", "value1");
//获取域数据
request.getSession().setAttribute("key1", "value1");
(1)设置Session的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
public void setMaxlnactielnterval(int interal)
值为,正数的时候,设定Session的超时时长。
负数表示永不超时( 极少使用)
(2)获取Session的超时时间
public int getMaxInactivelnteral()
(3)当前Session默认的超时时长是多少!
public void invalidate()
Session默认的超时时间长为30分钟。
因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为: 30 分钟。
<session-config>
<session-timeout> 30session-timeout>
session-config>
(4)web.xml配置文件中修改web工程所有seession的默认超时时长
(5)session的超时指的是,客户端两次请求的最大间隔时长。
(6)Session马上销毁
总结:Session技术,底层其实是基于Cookie技术来实现的。客户端在没有Cookie的情况下访问服务器,服务器创建session,并将session存储进内存,同时将sessionId信息通过cookie发送给浏览器,浏览器收到cookies后,当携带当前cookie信息再次访问服务器时,服务器就会从内存中取出对应的session数据。