介绍
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
生命周期
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* servlet的生命周期
* 1.web容器实例化servlet
* 2.调用init()方法
* 3.如果发生了请求 会立刻调用service()方法,根据请求的类型分别选择get或者post方法
* 4.请求结束,相应结束servlet会销毁 会调用destroy()方法 内存回收
*
* url配置
* 路径
* 1.全路径匹配 /MyServlet
* 2.通配符匹配 /xx/*
* 3.扩展名匹配 *.action *.go *.do
*
* servletConfig 代码我当前这个servlet的一些配置信息(重要)
* 每一个servlet都有他自己独特的servletConfig
*
*/
@WebServlet(name="MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init正在被调用");
super.init(config);
}
@Override
public void destroy() {
System.out.println("destroy正在被调用");
super.destroy();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证访问servlet的人的用户名和密码
String username = "xiaowang";
String password = "123456";
System.out.println("进入了MyServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
容器
@WebServlet(name = "ContextServlet")
public class ContextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//javaweb中的三种数据范围 三种容器
//servletContext 上下文容器 web.xml
//request 请求的容器
//session 会话容器
//都有setAttribute(String key,String value);
//都有getAttribute(String key);
//
ServletContext ctx = this.getServletContext();
//当前整个项目所有的数据都共享的容器
//统计在线人数,项目配置的全局数据
HttpSession session = request.getSession();
//一次会话中的数据实现共享 一次会话和业务需要关联
//用于登录存储用户数据,验证用户使用系统的时候有没有登录
System.out.println(request);
//一定是一次请求中数据共享
//用于在进入页面之前先进入后台,用于转发
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
获取请求数据
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
*/
@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class HeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取单个请求头的信息
String angent = request.getHeader("User-Agent");
//获取所有请求头的信息
Enumeration<String> enu = request.getHeaderNames();
while (enu.hasMoreElements()){
String s = enu.nextElement();
String value = request.getHeader(s);
System.out.println(s+":"+value);
}
//通过request获取请求参数
//1.通过键值对获取单个参数
// a:参数的key要和请求里面的键值对要匹配
// b:后台使用的key要和前台表单中的name属性一一对应
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.通过键值对获取多个相同的参数
//前台一定一个key对应多个值
//前台只要拥有同一个key后台就用这个key去接受,不一定是同一个表单对象
//checkbox hidden带数组会使用
String[] hoby = request.getParameterValues("hoby");
//3.一次性获取所有的参数(重点)
Map<String,String[]> map = request.getParameterMap();
UserBean user = new UserBean();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
//System.out.println(Arrays.toString(hoby));
//System.out.println(username + " " + password);
System.out.println("进入了LoginServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
乱码问题
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* 乱码产生的原因 前台 utf-8 后台 utf-8 tomcat ISO-8859-1
* get请求乱码
* 1.手动转码 先用ISO-8859-1解码 再用utf-8进行编码
* 2.修改tomcat的编码方式 在修改端口的那栏增加属性配置 URIEncoding="utf-8"
* post请求乱码(重点)
* 1.手动转码 先用ISO-8859-1解码 再用utf-8进行编码
* 2.一次性设置请求头信息中的编码
*
*
*/
@WebServlet(name = "EncodingServlet",urlPatterns = "/EncodingServlet")
public class EncodingServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//只适用于请求体中的参数设置不适用于请求行
//设置编码一定要放在第一行
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
//String name = new String(username.getBytes("ISO-8859-1"),"UTF-8");
//String pass = new String(password.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username+" "+password);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
响应数据
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* 相应response
*
*/
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置状态码
//response.setStatus(302);
//设置相应头
//text/plain 指定输出的格式为纯文本字符串 text/html指定输出的格式为网页
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
//设置字符集编码(重点)
//request.setCharacterEncoding("utf-8");
//设置响应体的字符集编码
response.setContentType("text/html;charset=utf-8");
//重定向
//response.setHeader("Refresh", "3;url=http://www.baidu.com");
//response.sendRedirect("http://www.baidu.com");
//设置相应到页面的内容
//字符流 用于相应页面,相应文本
//response.getWriter()
//字节流 用于图片,音频,视频
//response.getOutputStream()
ServletContext ctx = this.getServletContext();
String username = ctx.getInitParameter("username");
System.out.println(username);
response.getWriter().print("<h1>hello world!</h1>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
转发
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* 转发
* 1.可以实现页面跳转
* 2.页面的地址栏不变
* 3.转发可以转发其他servlet
* 4.在转发的过程中,只要你不中断这个过程中的所有步骤都共享一个request
* (并不是共享同一个变量,共享是同一个容器,数据互通)
*
* 同一个请求中数据传递
* request.setAttribute(key,value);
* request.getAttribute(key);
*
*/
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("username",username);
request.setAttribute("password",password);
//转发,参数是转发的地址
request.getRequestDispatcher("HeaderServlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
提供下载
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
*如果通过a标签下载
* 1.图片和文件不会下载,而是直接解析
* 2.文件名如果是中文有可能会出现乱码
* 3.只能下载除了图片,文本之外的文件(说明书、app等)
*
* @author IGEEK)潘杰
* @version 1.00 2020-04-03 10:17
*/
@WebServlet(name = "FileServlet",urlPatterns = "/FileServlet")
public class FileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过servlet下载,通过servlet的outputStream进行流的下载
//response.getOutputStream()
//文件下载
/*
* servletContext 上下文容器的配置(web.xml)
* servletConfig 我当前这个servlet的配置
*
* */
ServletContext ctx = this.getServletContext();
String username = ctx.getInitParameter("username");
//System.out.println(username);
//1.获取项目的发布的根目录,为了获取文件的路径
String fileName ="描述.csv";
String path = ctx.getRealPath("/");
System.out.println(path);
File f = new File(path+fileName);
System.out.println(f);
//2.获取服务器的资源文件的输入流
FileInputStream fi = new FileInputStream(f);
//3.指定response的输出类型(默认输出类型是text/html 网页)
response.setContentType(ctx.getMimeType(fileName));
//4.设置文件名称,不支持中文
//解决文件名是中文的问题(可选,可以自定义文件的名称只要不是中文就可以)
//处理中文文件名乱码
String header = request.getHeader("User-Agent");
if(header.contains("Firefox")){
//表示当前是火狐
BASE64Encoder base64Encoder = new BASE64Encoder();
fileName = "=?utf-8?B?" + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
}else{
//谷歌
fileName = URLEncoder.encode(fileName,"utf-8");
}
System.out.println(fileName);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
//相应字节流 tomcat会自动调用关闭和刷新方法
ServletOutputStream os = response.getOutputStream();
//5.文件复制,将文件的输入流写入到 response的输出流中去
byte[] arr =new byte[1024];
int len;
while((len=fi.read(arr))!=-1){
os.write(arr, 0, len);
}
fi.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Session与Cookie
@WebServlet(name = "SessionTestServlet",urlPatterns="/SessionTestServlet")
public class SessionTestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//session 服务器存储数据
//用于服务器各个请求之间的数据共享
//在同一次会话中实现数据的共享
//以前如果没有session,会新创建session 如果以前创建过,直接返回之前的
HttpSession session = request.getSession();
//以前如果有session 直接获取session,如果没有返回null
//HttpSession session = request.getSession(false);
System.out.println(session);
String id = session.getId();
System.out.println(id);
String username = (String)session.getAttribute("username");
System.out.println(username);
//session中实现数据共享
session.setAttribute("username", "xiaowang");
Cookie c = new Cookie("JSESSIONID",id);
c.setMaxAge(20000);
response.addCookie(c);
//session的原理
//session是基于cookie技术
//使session失效的方法
session.invalidate();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//服务器创建cookie
Cookie cookie = new Cookie("username", "admin");
//Cookie默认的失效时间 在你会话关闭的时候
//一个会话 浏览器关闭之前 ,同一种浏览器
//给cookie设置失效时间
cookie.setMaxAge(0);
//删除客户端cookie的办法
//cookie.setMaxAge(0);
//设置cookie的路径
//设置成/表示此cookie在任何网站都可以访问
//cookie.setPath("/");
System.out.println(cookie);
//将cookie交给客户端
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}