爬虫就是在割网页,数据解析就是在割协议,编译器就是在割代码。参数校验也需要正则。
由字节变成字符需要指定编码格式。
所有的语言文字在计算机中都是字符串。所以,实现国际化,归根结底就是根据语言类型去定义好字符串模板而已。
在正则表达式中,点 (.) 是通配符,可以匹配除换行符之外的所有字符。在书写语言中,句点 (.) 用来表示句子的结束。在数学中,小数点 (.) 用来分隔数字的整数部分和小数部分。
* 如果您能使用正则表达式来表示 IP 地址,那么就会取得出乎意料的效果。例如,正则表达式 0.0.0.0 可以匹配:0102030、0a0b0c0。用来匹配 IP 地址 0.0.0.0 的正则表达式应为:0.0.0.0。
* (.*)连在一起就意味着任意数量的不包含换行的字符
aaaaaaaaaaa =》 a+
java中正则表达式涉及java.util.regex包。
主要有Pattern类与Matcher类。Pattern是做模具的师傅,pattern将模具(正则表达)做好之后,指派一个小工(matcher)去匹配。
Pattern类API
* Pattern.complie(String regex):Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建。(利用静态方法生成对象的,都属于工厂模式。所以单例模式也可以说是一种工厂模式,只不过多了双重检查机制)
* Pattern.split(CharSequence input):用于分隔字符串,并返回一个String[]。String.split(String regex)也有相同的功能。
* Pattern.matcher(CharSequence input):返回一个Matcher对象。
Matcher类API
* Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.
* matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true
* lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
* find()对字符串进行匹配,匹配到的字符串可以在任何位置.
##find有点像一个迭代器(如hasNext),需要配合while使用##
* start()返回匹配到的子字符串在字符串中的索引位置.
* end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
* group()返回匹配到的子字符串
Group类
Java正则表达式中的“组”概念与“子表达式”其实是一样的。
public void testGroup() {
String regEx = "(\\d+)(df)";
String s = "count000dfdfsd111dfaaaa1";
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(s);
System.out.println(mat.groupCount()); // 2
// if(mat.find()){
// System.out.println(mat.group());
// System.out.println(mat.group(0));
// System.out.println(mat.group(1));
// System.out.println(mat.group(2));
// }
while (mat.find()) {
System.out.println(mat.group(1));
System.out.println(mat.start());
System.out.println(mat.end(1));
System.out.println(s.substring(mat.start(), mat.end(1)));
}
}
SMB不仅提供目录和打印机共享,还支持认证、权限设置。运行于TCP/IP协议上,主要是自己多了是否要连接的功能。
Samba的工作流程主要为四个阶段:
一:协议协商
客户端在访问Samba服务器时,首先由客户端发送一个SMB negprot请求数据报,并列出它所支持的所有SMB协议版本。服务器在接收到请求信息后开始响应请求,并列出希望使用的协议版本,选择最优的SMB类型。如果没有可使用的协议版本则返回oXFFFFH信息,结束通信。
二:建立连接
当SMB协议版本确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送SesssetupX请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器,然后服务器通过发送一个SesssetupX请应答数据报来允许或拒绝本次连接。
三:访问共享资源
当客户端和服务器完成了协商和认证之后,它会发送一个Tcon或SMB TconX数据报并列出它想访问网络资源的名称,之后服务器会发送一个SMB TconX应答数据报以表示此次连接是否被接受或拒绝。
四:断开连接
连接到相应资源,SMB客户端就能够open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。
samba服务器的安全模式
samba服务器有share、user、server、domain和ads 五种安全模式,用来适应不同的企业服务器需求。
java读文件
分两种文件:类路径中的和webapps中的(如网页)。由于src中的类在编译后就放在web工程里面了,所以他们示有联系的。
一般的配置文件spring自己会读。但是在手动解析文件的时候就需要自己读文件了。
* 类路径:
* 使用getClassLoader。它寻找fileName都是从classpath去找的,毕竟是ClassLoader,class肯定在classpath下。
* 手动获取classpath的绝对路径:XXXclass.getResource("/").toString()。所以类路径也就是根路径。
* 绝对路径。
* 相对路径。
* 以webroot为根目录:getServletContext().getRealPath("/index.jsp")
* 如果想读src中的内容,就要补全"/WEB-INF/classes/":getServletContext().getRealPath("/WEB-INF/classes/test.txt")
ServletContext
一个ServletContext对象表示了一个Web应用程序的容器。硬盘》内存》tomcat容器》ServletContext容器,容器中存放对象,对象的交互实现功能。
容器的核心作用就是一张表。
1. 获取方法
* ServletContext在jsp中用application内置对象来表示
* 在Servlet中通过调用方法getServletContext()获取
* request.getSession().getServletContext()
2. 主要API:
* 可以给这个容器对象设置属性,同一个web应用的其他servlet就可以使用了。
* 提供对web应用组成的静态内容的访问:getResource、getResourceAsStream。
##这些方法不用来获取动态内容。比如,在一个支持JSP规范1的容器中,getResource("/index.jsp")这种形式的方法调用将返回JSP源代码,而不是处理后的输出。关于访问动态内容,参见“转发请求”。
* 既然可以实现Servlet间的通信,就可以进行请求转发。
* 之前我们学过的请求转发是通过request对象的: request.getRequestDispatcher("/url").forward(request, response);
* ServletContext也可以实现请求转发: this.getServletContext().getRequestDispatcher("/url").forward(request, response); 这两个转发效果是一样的。
【项目】 Web聊天室
Socket实现的聊天室太简陋了,可以配合swing实现图形化界面。
这里利用ServletContext实现一个简单的Web聊天室,主要功能:
登录页面
用两个按钮来提交和重置登录信息
在登录界面上实现记住用户名和密码的功能
3个Servlet
登陆成功/失败需要跳转到不同的页面。
消息输入窗口。“发送”按钮
聊天记录窗口
##岂不是还可以实现文件、图片和表情包的上传下载
Listener
监听会话的创建和销毁事件,以此统计当前在线(登录)人数,并将其显示在聊天界面上。
Filter
实现对请求和响应对象的编码格式的设置(实现此功能后,Servlet可以直接从请求对象中获取参数信息而无需实现对请求进行格式的编码)
实现敏感字符的过滤
* filter创建的时候,需要读文件,放在集合里。由于全是单词,所以也就不需要割,只要把每一行都放在集合里即可。
* 实现:filter利用动态代理实现了增强(这比LoginFilter用到的技术厉害一些)。否则servlet每次调用request的时候就需要写过滤敏感字符的代码。
【项目】 网盘系统
文件上传后,在数据库增加一条记录
显示一个列表页面,供用户进行文件下载。
https://www.bilibili.com/video/av37883765?from=search&seid=9380428791312322969
国际化
* 定义:国际化就是切换页面显示的语言。当用户选择不同的国家,就显示相应语言的文本。但并不是所有文本信息都会变,只有静态的文本,才能实现进行配置。
* 实现:给每一个国家写一个配置文件,不写死,而是从配置文件里面读。其实与生产环境和测试环境的切换是一个道理。国际化里面的配置文件叫做资源包,它包含一组配置文件,一般放在classpath下。
* 核心类:ResourceBundle,**用于读取配置文件中的数据**。
切换语言就是自己请求自己的页面,根据页面传过来的参数选择使用哪一个locale。事实上最好还是自动获取浏览器的语言,从而用户不需要切换语言。
bundle = ResourceBundle.getBundle("msg", locale) // local写成变量,连判断都省了
bundle.getString(key)
配置文件的命名是有格式的。
message_zh_CN.properties
message_en_US.properties
request的API
Locale getLocale():取得Accept-Language中浏览器首选的locale。java.util.Locale表示国家和言语,这个东西在国际化中有用。properties资源包没有对应的,就会选默认的。
String getCharacterEncoding():获取请求编码,如果没有设置过,那么返回null,表示使用ISO-8859-1编码;
为了避免在jsp中写java代码,jstl也提供了国际化标签fmt。
jsp并不是对标html,而是对标ajax
jsp = 文件头 + html + java
文件头:<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
* <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> @的感觉是在呼叫,所以是导入资源的意思,所有文件一开始都是引入资源。
导入标签、其他jsp、jar包以及设置本页面的属性。
html标签:html》head》body
java代码:
* <% %> 这里的代码会放在servlet的service方法中,定义的变量也是方法的变量。
* <%! %> 这里的代码会放在类中,可以定义成员变量(用得少,防止出现线程安全问题)、成员方法、静态代码块。
* <%= %> 输出语句。第一个标签里面写的sout只会输出到控制台,要是想输出到页面,就得使用out.print()方法。如果输出字符串,那就和写在这个标签外面的效果一样,可以输出内置对象的值。
##解耦 View层尽量不写java代码
通过c标签实现循环和判断(以便展示数据),利用el表达式获取域对象中的值,从而替换掉java代码
${pageContext.request.contextPath}:获取request请求地址的共同部分。
前后端分离的时候,变量是放在js代码里面,然后利用js框架,展示数据。
jsp的时候,变量是放在域对象里面,然后利用c标签和el表达式展示数据。使用了springMVC框架之后,变量就放在了Model或者ModelAndView里面。
展示列表好说,如何展示一棵树?
socket通信获得输入输出流 》 request、response对象获取输入输出流 》 文件的上传下载
file and code templates可以修改模板,包括servlet和jsp。
cookie就是客户端的一个对象,起到一个记录的作用。
登录功能需要servlet和filter共同实现。filter负责保护页面,实现重定向功能,利用request对象获得session,从而判断用户是否登陆,servlet负责实现登录功能。
验证码是单独的servlet实现的?点击刷新验证码,在jsp里面用的应该不是ajax吧。但是图片是可以单独发请求,接受响应数据的。毕竟图片比较大,很早就实现异步了吧。
网友评论