1.为什么需要servlet技术
-
比如需求,我们希望用户可以发帖,用户可以还可以回复...这样一些用户交互功能,用普通的javaJ技术就完成不了,sun就可以开发了servlet技术供程序员使用。
2. 什么是servlet?
Servlet是Server和applet(小程序)的结合写法,意思是服务器小程序用于扩展web服务软件业务功能的组件,每一种请求都需要对应一个单独的Servlet(对应WebServer的业务)
-
Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。I
-
Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口
-
Servlet想要运行,必须依靠一个Web服务器软件,也称Web容器(Tomcat)
3.Servlet生命周期
-
执行Servlet构造方法
-
执行init()初始化方法
第一、二步是在第一次访问的时候创建Servlet程序调用
-
执行service()方法
第三步,每次访问的时候都会调用
-
执行destroy销毁方法
第四步在web工程停止的时候访问。
package cpm.jack.jk.controller;
import javax.servlet.*;
import java.io.IOException;
public class Akl implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("出生");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("生命");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("死亡");
}
}
可见在生命周期里只在第一次访问创建一次,关闭浏览器窗口才结束生命周期.
4.ServletContent对象
1.概念
代表整个web应用,可以和程序的容器(服务器)来通讯
2.获取方式
request.getServletContext();
this.getServletContext();
3.有获取访问流量的作用
package cpm.jack.jk.controller;
import javax.print.attribute.HashAttributeSet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.HttpURLConnection;
public class Fji extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
Object count = context.getAttribute("count");
if (count==null){
context.setAttribute("count",1);
}else {
int value= (Integer)count;
context.setAttribute("count",value+1);
}
System.out.println(context.getAttribute("count")+"次数");
}
}
5.HTTP
请求格式
1.GET
请求行
- 请求的方式 GET
- 请求的资源路径[+?+请求参数]
- 请求的协议的版本号 HTTP/1.1
请求头
- key : value 组成 不同的键值对,表示不同的含义(get方式没有请求体,在URL以字符串形式传达)比如下图
2.POST
请求行
- 请求的方式 GET
- 请求的资源路径[+?+请求参数]
- 请求的协议的版本号 HTTP/1.1
请求头
- key : value 组成 不同的键值对,表示不同的含义。
请求体
- key+ value 组成不同的键值对
请求头:
Accept:告诉服务器,客户端支持的数据类型。
Accept-Language: 告诉服务器,客户端支持的请求的语言类型。
User-Agent:浏览器信息
Accept-Encoding:告诉服务器,客户端支持的数据编码(压缩)格式类型
Host:请求地址
Connection:告诉服务器,请求如何处理。
Content-Length: 告诉服务器,请求内容长度
Content-Type: 告诉服务器,提交的内容类型
该图片是火狐浏览器里 显示
6.request对象
HttpServletRequest对象的 getParameter(String name) 方法用于获取客户端请求中指定名称的参数值。
在 HTTP 请求中,参数通常通过查询字符串(GET 请求)或请求体(POST 请求)传递。getParameter() 方法可以从这些地方提取参数值,并返回一个字符串。
下面是一个示例,展示了如何使用 getParameter() 方法获取请求参数:
package cpm.jack.jk.controller;
import javax.print.attribute.HashAttributeSet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.HttpURLConnection;
public class Fji extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object username = req.getParameter("username");
Object password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
}
我们发现username出现乱码,解决方式
1.POST
request.setCharacterEncoding("UTF-8");
2.GET
String username = request.getParameter("username"); //GBK
username = new String(username.getBytes("GBK"),"UTF-8")