吾心吾行澄如明镜,所作所为皆为正义。

Ritchie里其

园龄:2年6个月粉丝:4关注:7

servlet

Servelt

简介

Server 和Applet的缩写,"服务端小程序"的意思。
本质也是Java类。
提供了Servlet功能的服务器,就是Servlet容器,比如Tomcat,Jetty等。

新建web项目

New Project->Java Enterprise->Web Application

服务器地址配置

IDEA右上角Tomcat->Edit->Server(改默认浏览器、端口号)->Deployment(改地址)

Http

服务端保存在客户端的信息。
格式:键值对,用=连接,用;隔开

// 创建cookie对象
Cookie cookie = new Cookie("name", "123456");
// 发送cookie对象
resp.addCookie(cookie);
// 获取cookie对象,得到的是一个数组
Cookie[] cookies = req.getCookies();
// 判断cookie是非为空
if (cookies != null && cookies.length > 0){
// 遍历cookie数组
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("名称:" + name + ",值:" + value);
}
}
// cookie到期时间,默认-1,浏览器退出即删除
// 正整数,单位时间s后删除
// 0,立即删除
cookie.setMaxAge(-1);

cookie只在当前浏览器有效;
不能存中文,除非编解码
同名cookie会覆盖
cookie存储大小有限,4k左右

// cookie路径设置
// "/"表示当前服务器下任何项目都能访问到
// 只有访问路径中包含path值,才能获取到该cookie对象
cookie.setPath("/")

Session

标识一个会话,并且在一次会话(用户的多次请求)期间共享数据。
对服务器而言,每个连接到它的客户端都是一个session。

标识符jsessionid

标识一次会话的唯一的标志。

// 获取session对象
HttpSession session = req.getSession();
// 获取session的会话标识符
String id = session.getId();
// 获取session的创建时间
long creationTime = session.getCreationTime();
// 获取最后一次访问的时间
long lastAccessedTime = session.getLastAccessedTime();
// 判断是否是新的session对象
boolean aNew = session.isNew();

session域对象

Tomcat中session默认存活时间为30min,在安装目录conf下的web.xml中的中配置

// 获取session对象
HttpSession session = req.getSession();
// 设置session域对象
session.setAttribute("uanme","");
// session对象的最大不活动时间
int maxInactiveInterval = session.getMaxInactiveInterval();
// 修改这个最大不活动时间为15秒
session.setMaxInactiveInterval(15);
// 立即销毁session
session.invalidate();
// session的底层cookie实现,cookie只存在浏览器内存中,关闭浏览器即失效,所以session也是一样,因为没有jsessionid与之对应
// 关闭tomcat服务器,session也会销毁

文件上传和下载

<body>
<!--
文件上传:
1、建表单
2、设置提交类型为POST
3、设置表单类型为文件上传
4、设置文件提交地址
5、准备表单元素
- 普通表单项“text”
- 文件项“file”
6、设置表单元素name属性值
-->
<form method="post" enctype="multipart/form-data" action="uploadFile">
姓名:<input type="text" name="uname"><br>
文件:<input type="file" name="myfile"><br>
<!-- button默认类型为提交“submit”-->
<button>提交</button>
</form>
</body>
@WebServlet("/uploadFile") // 这里要跟前端的name保持一致
@MultipartConfig // 文件上传,必须要就该注解
public class UploadFile extends HttpServlet {
// ctrl + o 选择service-http
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求的编码格式
req.setCharacterEncoding("UTF-8");
// 获取普通表单项(获取参数),参数跟前端页面name属性值保持一致
String uname = req.getParameter("uname");
// 获取part对象,并得到上传文件名
Part part = req.getPart("myfile");
String fileName = part.getSubmittedFileName();
// 得到文件存放的路径
String realPath = req.getServletContext().getRealPath("/");
// 上传文件到指定目录
part.write(realPath + "/" +fileName);
}
}

下载:

<body>
<!--
超链接(a标签)下载
如果浏览器能够识别,会显示内容,如果浏览器不能识别就下载
download属性
-->
<a href="">文本文件</a>
<a href="">图片文件</a>
<a href="">压缩文件</a>
<a href="" download>文本文件</a>
<a href="" download="百度.png">图片文件</a>
<form>
文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
<button>下载</button>
</form>
</body>
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件下载。。。");
// 设置请求的编码格式
req.setCharacterEncoding("UTF-8");
// 获取参数(得到要下载的文件名)
String fileName = req.getParameter("fileName");
// 参数的非空判断 trim():去除字符串的前后空格
if (fileName == null || "".equals(fileName.trim())) {
resp.getWriter().write("请输入要下载的文件名");
resp.getWriter().close();
return;
}
// 得到图片存放的路径
String realPath = req.getServletContext().getRealPath("");
// 通过路径得到file对象
File file = new File(realPath + fileName);
// 判断文件对象是否存在并且是一个标准文件
if (file.exists() && file.isFile()) {
// 设置响应类型
resp.setContentType("application/x-msdownload");
// 设置响应头
resp.setHeader("Content-Disposition","attachment;filename=" + fileName);
// 得到file文件输入流
FileInputStream inputStream = new FileInputStream(file);
// 得到字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 定义byte数组
byte[] bytes = new byte[1024];
// 定义长度
int len = 0;
// 循环输出
while ((len = inputStream.read(bytes)) != -1) {
// 输出
outputStream.write(bytes, 0,len);
}
// 关闭资源
outputStream.close();
inputStream.close();
} else {
resp.getWriter().write("文件不存在,请重试!");
resp.getWriter().close();
}
}

Filter

C/S、B/S

HttpServletRequest

用来接受客户端发来的请求信息

  • req对象用于接收客户端浏览器提交的数据,从浏览器端发出请求,取得数据。
  • resp对象将服务器端的数据发送到客户端浏览器。

request作用域

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

// 设置域对象内容
req.setAttribute("name","lee");
req.setAttribute("age",18);
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
req.setAttribute("list",list);
// 设置请求跳转
// req.getRequestDispatcher("page05").forward(req,resp);
req.getRequestDispatcher("index.jsp").forward(req,resp);
// 获取域对象内容
String name = (String) req.getAttribute("name");
System.out.println("name:" + name);
Integer age = (Integer) req.getAttribute("age");
System.out.println("age:" + age);
List<String> list = (List<String>) req.getAttribute("list");
System.out.println(list.get(0));

HttpServletResponse

web服务器收到客户端请求后,分别创建一个request和一个response。
request用于获取客户端数据
response用于向客户端输出数据

// 同时设置客户端和服务端的编码格式,解决中文乱码问题
resp.setContentType("text/html;charset=UTF-8");
// 字符输出流
// PrintWriter writer = resp.getWriter();
// writer.write("Hello");
// 字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write("Hi".getBytes());

注:getWriter()和getOutputStream()不能同时用

重定向

客户端的行为
客户端发出一个请求,服务器响应的同时,又给了客户端一个新地址,然后客户端又立刻对新地址发起第二个请求,服务器接收响应。重定向完成。
可跨域
地址栏会变化
数据不共享

resp.sendReirect();
转发

服务端的行为
地址栏不发生变化
一次请求,数据在request域中共享

req.getRequestDispatcher().forward(req,resp);
Ajax

Async javascript and xml
现在已经用json代替xml

ServletContext对象

又称Application对象,每个web应用有且只有一个ServletContext对象。
作用:
1、作为域对象来共享数据
2、该对象保存了当前应用程序的相关信息

本文作者:Ritchie

本文链接:https://www.cnblogs.com/wang-zeyu/p/16923936.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ritchie里其  阅读(30)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
✨欢迎你~🍻
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 遥か Aimer
遥か - Aimer
00:00 / 00:00
An audio error has occurred.

作词 : aimerrhythm/田中ユウスケ

作曲 : 田中ユウスケ

编曲 : 玉井健二/百田留衣

海岸線の雨に ちらばった君の影

思い出が交差する 海辺の街

君はあの日のまま いまも夢を見てた

君はあの日のまま いまも夢を見てた

遥か記憶の空 2人照らす光

遥か記憶の空 2人照らす光

膝までの浅瀬で 見つけた星

君まで届くなんてさ ありえないような

浅い眠りの中で 深い夢から覚めて

浅い眠りの中で 深い夢から覚めて

裸足のまま駆けてく まばゆい星

君はあの日のまま どんな夢を見てた?

君はあの日のまま どんな夢を見てた?

遥か記憶の空 2人照らす光

遥か記憶の空 2人照らす光

いつまでもこうして 笑っててほしい

夜空に舞い上がる 幾千の花びら

でたらめな誓いで 生きてく日々

君から届くなんてさ ありえないような