2Servlet笔记
1、静态页面(html)
2、动态
用户可以输入数据,和页面交互。
3 BS和CS的区别
BS :Browser Server(WEB 服务器) CS : Client(qq tcp/ip协议) Server
写一个WEB服务器.
package 细说Servlet;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class MyWebServer {
public static void main(String[] args) {
ServerSocket ss;
Socket s = null;
OutputStream os = null;
BufferedReader br = null;
try {
ss = new ServerSocket();
System.out.println("在9999端口等待...");
s = ss.accept();
//提示一句话
System.out.println("连接成功");
os = s.getOutputStream();
br = new BufferedReader(new FileReader("E:/hello.html")); String buf = "";
while ( (buf = br.readLine()) != null) {
//系统使用默认的字符集转换
os.write(buf.getBytes());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
br.close();
os.close();
s.close(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
Tomcat本身也是java程序,必须配置jdk
netstat -an 查看
netstat -anb
可以在setup.bat 中添加JAVA_HOME= jdk的目录 ,来配置电脑的jdk
conf配置文件:
server.xml
web.xml:该文件配置与web应用相关的信息,web应用相当于一个web站点
tomcat-users.xml:配置用户密码
lib:存放存放tomcat所需要的jar包
log:存放日志,
webapps该目录放置web站点
work:存放jsp被访问后生成对应的servlet文件
----------------------------------------------------------
Tomcat怎么管理虚拟目录:我们希望tomcat管理其他目录的站点
在conf文件中配置server.xml中</host>上一行添加该语句
context有几个属性:
path:
docBase:
reloadable:若设置true,表示tomcat会自动更新web应用,这个开销大,建议在开发过程中设为true,发布后设为false
如何配置自己主机名,我们在访问一个网站时,不可能使用 http://localhost:8080/应用/资源名 的方式去访问网站,实际上使用 www.taobao.com 的方式,如何实现呢?
实现的步骤如下:
(1)修改 C:\Windows\System32\drivers\etc 下hosts文件,添加这么一条语句: 127.0.0.1 www.taobao.com
(2)在tomcat 的server.xml文件添加主机名
<Host name="www.taobao.com" appBase="d:\web3”> <Context path="/" docBase="d:\web3" /> </Host>
(3)在d:/web3添加一个/WEB-INF/web.xml 把 hello2.html设为首页面 如果连端口都不希望带,则可以吧tomcat的启动端口设为80即可
当使用http://127.0.0.1:8080时会自动跳转到localhost,如何修改主机名不跳转到localhost
如何配置默认主机:
在tomcat/conf/server.xml 文件
<Engine name="Catalina" defaultHost="主机名">
如:<Engine name="Catalina" defaultHost="www.show.com">
继承HttpServlet 需要实现doPost和doGet
安全性看,get弱于post;提交的内容来看,post理论上不限制,在实际开发中不要太大;
Servlet的一些细节:
(1)对一个注册的servlet可以多次映射
(2)通配符:
Servlet通过对外路径访问可以通过通配符替换,一是 匹配 *. 匹配.do结尾的(这种级别最低) 二是 /abc/* 表示当前路径下的所有
(3)Servlet的单例问题,当servlet被第一次访问后就会被加载到内存,以后该实例对各个请求服务,即在使用中是单例(多个服务共享一个变量)
因为Servlet是单例模式,因此会出现线程安全问题,比如售票系统(成员变量),如果不加同步机制会出现问题。
这里有一个原则: 1. 如果一个变量需要多个用户共享,则应该在访问该用户变量时,加同步机制 synchronized(对象) {}
2. 如果一个变量不需要共享,只需在doGet和doPost中定义(局部变量)即可,这样不会存在线程不安全问题
(4) <load-on-setup>num</load-on-setup> 其中num表示servlet被init的顺序
(5) servletConfig
-------------------------------------------------------------
HTTP协议
http是建立在tcp/ip协议之上的,全称是超文本传输协议
http1.0短连接,http1.1长连接(就像打电话一样,短连接是指打完就挂掉了,长连接会保存一段时间),所谓的长和短是指持续的时间,长连接大概是30秒
http的请求:
结构:
请求行;消息头,并不是消息头都一样;内容
referer:用来记录是从哪个页面进来的,当直接在浏览器中输入url时,返回值为null。所以可用来做防盗链
String referer = request.getHeader("referer");
if (referer == null || !referer.startsWith("http://localhost:8888/ServletPro/")) {
response.sendRedirect("/ServletPro/Error");
}
http的响应状态行举例说明
2200 就是整个请求和响应没有错误,这个最常见
302 当你请求一个资源时,服务器返回302表示,让浏览器转向另一个资源。比如request.sendRedirect("/web应用名/资源名");
response.sendRedirect("/ServletPro/Error"); // 和下面两句等价
response.setStatus(302);
response.setHeader("Location", "/ServletPro/Error");
404 not found
500 服务器出错
举例说明refresh的作用:
response.setHeader("Refresh", "5;url=http://www.baidu.com"); //5秒之后跳转到百度
下载文件 原理:先由服务器读取,然后再从服务器写入浏览器
//1、设置参数
response.setHeader("Content-Disposition", "attachment; filename=abc.png");
//2、获得全路径
String path = this.getServletContext().getRealPath("/images/abc.png");
//System.out.println(path);
FileInputStream fis = new FileInputStream(path); //读取到服务器
byte buff[] = new byte[1024];
int len = 0;
OutputStream os = response.getOutputStream();
while ( (len = fis.read(buff)) > 0) {
os.write(buff, 0, len); //读取到服务器,并由服务器写入浏览器
}
os.close();
fis.close();
缓存页面举例:
我们的浏览器在默认情况下,会缓存我们的页面,这样会出现一个小问题:当我们把光标停在地址栏,然后回车去取页面就会默认从cache中获得
(1)有些网址对及时性要求很高,因此不需要缓存
三种禁止浏览器缓冲
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
httpServletResponse的在说明
getWriter()和getOutputStream()区别:
1、getWriter()用于向客户端返回字符数据
2、getOutputStream()可以回送字符数据,也可以回送字节数据(二进制数据)
OutputStream os = response.getOutputStream();
os.write("hello world".getBytes()); //字符串变成二进制数据
如何选择
我们回送的是字符数据,用getWriter()效率高
我们回送的是字节(binary data) 只能用OutputStream,
---这两个流不能同时使用
sendRedirect()的使用方法:
问题:登录成功时,将用户名显示在登录成功页面
解决方法: 1; 设置静态变量
2;sendRedirect("welcom?uname="+username+"&参数名="+参数值); 参数名为字母组合,参数值为String
在接收方时,String 参数 = request.getParaMeter
3;使用session, session可以传递对象
中文乱码处理
(1).表单
post: 浏览器(utf-8编码方式)提交给web服务器(以iso-8859-1接受) ; request.setCharacterEncoding("utf-8") // 这个还是不好
get:将信息放入请求行中,new String(request.getParameter("userName").getByte("iso-8859-1"), "utf-8")
(2) 超链接 默认是get方式,所以解决同表单中get的处理方式
HttpServletRequest对象的详解:
request.getQueryString() 可以获得请求的数据;
url:是全部的网址 uri 是包含 web层和资源层
request.getRemoteAddr() //获得请求方的ip
request.getRemoteHost() //获得请求仿的主机名
补充一个知识点:当我们下载一个文件时,可能提示框是中文乱码
String temp = java.net.URLEncoder.encode("传奇.mp3", "utf-8");
HttpServletRequest常用方法:
1、获得客户机请求头: getHeader(), getHeaderNames()
2、获取到客户机请求参数
sendRedirect()和forward()区别:
1 叫法不同,sendRedirect()是重定向,转发, forward是转向
2、实际发生的位置不一样,sendRedirect发生在浏览器,forward发生在web服务器
3、用法不一样
request.getRequestDispatche("资源/uri").forward(request, response)
response.sendRedirect("/web应用")
4、能够跳转的地方不同
sendRedirect可以进入任何(包括外边)url, forward只能访问该web应用下的资源
什么叫一次http请求
只要没有停止,也没有回到浏览器重定向,就是一次请求。
如果转发多次,我们浏览器地址栏保留的是第一次转向的那个Servlet URL
2Servlet笔记的更多相关文章
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- 动态sql and在前 逗号在后
- JavaScript Decorators 的简单理解
Decorators,装饰器的意思, 所谓装饰就是对一个物件进行美化,让它变得更漂亮.最直观的例子就是房屋装修.你买了一套房子,但是毛坯房,你肯定不想住,那就对它装饰一下,床,桌子,电视,冰箱等一通买 ...
- hdu-3374(kmp+最小表示法)
题意:给你一个字符串,这个字符串我们可以把把他变成n个字符串按照以下规则:将当前字符串第一个放到字符串最后一位,字符串的下标依次向前推一位,比如:s[1] s[2 ]s[3] s[4]->s[2 ...
- Codeforces Round #443 Div. 1
A:考虑每一位的改变情况,分为强制变为1.强制变为0.不变.反转四种,得到这个之后and一发or一发xor一发就行了. #include<iostream> #include<cst ...
- 洛谷P3381 最小费用最大流
费用流板子 还是一道板子题..先练练手 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset( ...
- 给 Haproxy 创建日志文件
背景介绍:默认下的Haproxy配置是不会生成日志文件的,而无运行日志,无法确定系统运行是否流畅,无法提起预判可能发生的故障 创建Haproxy日志文件的步骤如下vi /etc/rsyslog.con ...
- Hdoj 2602.Bone Collector 题解
Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone C ...
- Hdoj 1007 Quoit Design 题解
Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...
- hexo报错集锦
1.报错信息如下 FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubles ...
- Vue--的src文件
1.assest: 图片等等...... 2.components: 组件 3.App.vue: 根组件,三个部分:模板.行为(处理逻辑).样式: 模板: 只能有一个根标签: <HelloWor ...