Servlet基础
Servle创建
//第一种,不管提交方式
@WebServlet("/s01")//注解,/s01为目录
public class Servlet01 extends HttpServlet{//继承
@Override//方法重写注解
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//req请求,resp响应
}
...................................................................................................................
//第二种,自动辨识提交方式
@WebServlet("/s02")
public class Servlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// get方法提交处理
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// post方法提交处理
}
}
获取客户端参数
String url = req.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL:"+url);
String uri = req.getRequestURI().toString();
System.out.println("获取客户端请求的部分URL:"+uri);
String queryString = req.getQueryString().toString();
System.out.println("获取客户端请求行中的部分参数:"+queryString);
String method = req.getMethod().toString();
System.out.println("获取客户端的请求方式:"+method);
String protocol = req.getProtocol().toString();
System.out.println("获取Http版本号:"+protocol);
String webapp = req.getContextPath().toString();
System.out.println("获取webapp名字:"+webapp);
String uname = req.getParameter("name");
String psw = req.getParameter("password");
System.out.println("用户名:"+uname+"\n密码:"+psw);
String[] ff = req.getParameterValues("hob");
System.out.println(ff.length);
Servlet生命周期
@WebServlet("/s03")
public class Servlet03 extends HttpServlet {
@Override
public void destroy() {//结束,只执行一次
System.out.println("destroy.....");
}
@Override
public void init(ServletConfig config) throws ServletException {//开始只执行一次
System.out.println("init.....");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("service.....");
req.setCharacterEncoding("UTF-8");
System.out.println(req.getParameter("name"));//取得服务器get/post元素
System.out.println(req.getParameter("password"));
// 请求跳转,不改变地址,服务器跳转(一次请求)
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
重定向
@WebServlet("/s04")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.service(req, resp);
// 重定向,地址改变,客户端跳转(两次请求),对象不共享
resp.sendRedirect("index.jsp");
}
}
客户端&服务端编码格式设置
@WebServlet("/s05")
public class Servlet05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置服务端编码
resp.setCharacterEncoding("UTF-8");
// 设置响应类型,客户端编码格式
resp.setHeader("content-type","text/html;charset=UTF-8");
//同时设置客户端与服务端编码格式:
// resp.setContentType("text/html;charset=UTF-8");
// 输出流方法一,两种方法不能同时存在
PrintWriter writer = resp.getWriter();
writer.write("<h2>hello 05<h2>");
writer.close();
// 输出流方法二
// ServletOutputStream out = resp.getOutputStream();
// out.write("<h2>hello 00</h2>".getBytes());
// out.close();
}
}
cookie创建及到期时间
@WebServlet("/cook01")
public class Servlet06 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建cookie对象,设置cookie到期时间
Cookie cookie01 = new Cookie("name", "admin");
Cookie cookie02 = new Cookie("age", "18");
Cookie cookie03 = new Cookie("sex", "woman");
// 设置失效时间
cookie01.setMaxAge(-1);//默认,随浏览器页面生成、消亡
resp.addCookie(cookie01);
cookie02.setMaxAge(7*24*60);//存在时间为7*24*60S
resp.addCookie(cookie02);
cookie03.setMaxAge(7*24*60);//存在时间为7*24*60S
resp.addCookie(cookie03);
}
}
cookie获取与删除
@WebServlet("/cook02")
public class Servlet07 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// cookie的获取
Cookie[] cooks = req.getCookies();
if (cooks != null && cooks.length > 0) {
for (Cookie cook : cooks) {
System.out.println("名称:" + cook.getName() + "值:" + cook.getValue());
}
// 删除cookie
Cookie cook = new Cookie("age",null);
cook.setMaxAge(0);
resp.addCookie(cook);
}
}
}
cookie注意点
@WebServlet("/cook03")
public class Servlet08 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//cookie只存在当前浏览器,不跨浏览器,不跨电脑
//cookie不能设置中文,中文需进行编码和译码
//cookie有存储上线
//cookie在同域名和路径下出现相同属性会覆盖
String name = "姓名";
String value = "张三";
//编码
name = URLEncoder.encode(name);
value = URLEncoder.encode(value);
resp.addCookie(cook);
Cookie cook = new Cookie(name,value);
//cookie路径
cook.setPath("/");
//"/"当前项目下任何项目都能访问,"/s01"s01项目下任何项目都能访问,"/s02/cook"只能在/s01/cook目录下才能访问改对象
Cookie[] cooks = req.getCookies();
//获取时解码
String qname = URLDecoder.decode(cooks[0].getName());
String qvalue = URLDecoder.decode(cooks[0].getValue());
}
}
HttpSession对象
@WebServlet("/se01")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取或创建Session对象,当Session存在时获取,不存在时创建
HttpSession session = req.getSession();
//获取会话标识符
System.out.println("会话标识符:"+session.getId());
//会话开始时间
System.out.println("开始会话时间:"+session.getCreationTime());
//是否是新session
System.out.println("是否是新的:"+session.isNew());
//最后一次访问时间
System.out.println("最后一次访问时间:"+session.getLastAccessedTime());
}
}
Session域对象
@WebServlet("/se03")
public class Session03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//向域对象添加数据
session.setAttribute("name","zs");
//从域对象获取数据
System.out.println(session.getAttribute("name"));
//从域对象移除数据
session.removeAttribute("name");
}
}
Session作用域
@WebServlet("/se02")
public class Session02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//req作用域
req.setAttribute("requestMsg","这是request作用域");
//session作用域
session.setAttribute("sessionMsg","这是session作用域");
}
}
Session的销毁
@WebServlet("/se04")
public class Session04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//TomCat服务器设置session默认到期时间30分钟,即该期间内没有做任何操作,可手动修改(不建议),在安装目录conf/web.xml中<session-timeout>
//手动设置
HttpSession session = req.getSession();
//设置session最大不活动时间
session.setMaxInactiveInterval(15);//15秒
//获取session最大不活动时间
int time = session.getMaxInactiveInterval();
System.out.println(time);
//手动销毁
session.invalidate();
}
}
ServletContext对象
@WebServlet("/scn01")
public class ServletCon01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//对象获取
//通过request对象获取
ServletContext servletContext = req.getServletContext();
//通过session对象获取
ServletContext servletContext1 = req.getSession().getServletContext();
//通过servletConfig对象获取
ServletConfig servletConfig = getServletConfig();
ServletContext servletConfig1 = servletConfig.getServletContext();
//直接获取
ServletContext servletContext2 = getServletContext();
//常用方法
//获取项目存放的真实路径
String realpath = req.getServletContext().getRealPath("/");
System.out.println(realpath);
//获取当前服务器版本信息
String serverInfo = servletContext.getServerInfo();
System.out.println(serverInfo);
}
}
文件上传
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--
表单类型:
普通表单:enctype="application/x-www-form-urlencodeed"(默认)
二进制表单:enctype="multipart/form-data"(文件上传需设置)
提交方式:GET/POST
文件上传用POST
表单元素:文件域
type="file"
-->
<form action="uploadServlet" enctype="multipart/form-data" method="post" name="upload">
姓名:<input type="text" name="uname">
头像:<input type="file" name="myfile">
<button>提交</button>
</form>
</body>
</html>
@MultipartConfig //文件上传必写该注解,否则所有参数都无法获取
@WebServlet("/uploadServlet")
public class uploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求编码格式
req.setCharacterEncoding("UTF-8");
//获取普通文本框
String uname = req.getParameter("uname");
// 得到part对象
Part part = req.getPart("myfile");
//得到上传文件名
String fileName = part.getSubmittedFileName();
//设置上传文件到什么路径
String uploadPath = req.getServletContext().getRealPath("/upload/");
//上传文件
part.write(uploadPath+fileName);
}
}
文件下载
超链接下载
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>超链接下载</title>
</head>
<body>
<!--
a标签在遇到能识别的资源时会直接打开,遇到不能识别的资源时会进行下载
-->
<a href="test.txt">TXT文本</a>//打开
<a href="test.png">图片</a>//打开
<a href="test.rar">压缩包</a>//下载
</body>
</html>
后台实现下载
<form action="downLoadServlet">
<input type="text" name="fileName">
<button>下载</button>
</form>
@WebServlet("/downLoadServle")
public class downLoadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("UTF-8");
//获取文件下载路径
String path = getServletContext().getRealPath("/");
//获取要下载的文件名
String name = req.getParameter("fileName");
//通过路径得到file对象
File file = new File(path + name);
//判断file对象是否存在,且是否时标准文件
if (file.exists() && file.isFile()){
//设置响应类型
resp.setContentType("application/x-msdownload");
//设置头信息
resp.setHeader("Content-Disposition","attachment;filename="+name);
//得到输入流
InputStream is = new FileInputStream(file);
//得到输出流
ServletOutputStream os = resp.getOutputStream();
//定义byte数组
byte[] car = new byte[1024];
//定义长度
int len = 0;
//循环输出
while ((len = is.read(car)) != -1){
os.write(car, 0, len);
}
//关闭流,释放资源
os.close();
is.close();
}else {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h2>文件不存在,下载失败!</h2>");
resp.getWriter().close();
}
}