什么是 xml? xml 是可扩展的标记性语言
xml 的主要作用有:
html 和 XML 注释 一样 :
xml元素指的是从开始标签到结束标签的部分(包括标签)
元素可包含其他元素,文本或者两者的混合物
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MvskcCGA-1658929339523)(JavaWeb尚硅谷.assets/image-20220726225815818.png)]
xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息
在标签上可以书写属性: 一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。
1)所有 XML 元素都须有关闭标签(也就是闭合)
2)XML对大小写敏感
3)XML 必须正确地嵌套
4)XML 文档必须有根元素
5)XML 的属性值须加引号
6)XML 中的特殊字符
> 特殊字符 : >
< 特殊字符 : <
7)文本区域 (CDATA区域)
CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml 语法
CDATA 格式:
xml 可扩展的标记语言。 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术
早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介(已经过时,但我们需要知道这两种技术)
dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析标记也做了实现。
第三方的解析:
jdom 在 dom 基础上进行了封装 、
dom4j 又对 jdom 进行了封装。
pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。
这个 Dom4j 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。
@Test
public void test1() throws DocumentException {
// 1、创建一个SaxReader输入流,来读取xml配置文件,生成document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 2、通过Document获取根元素
Element root = document.getRootElement();
// 3、通过根元素获取book标签对象
List<Element> books= root.elements("book");
// 4、遍历 处理每个book标签转换为book类
for (Element book : books) {
//asXML是将标签对象转化为标签字符串
Element name = book.element("name");
// getText()获取标签中的文本内筒
String nameText = name.getText();
//获取属性的值
String sn = book.attributeValue("sn");
}
}
所有通过Java语言编写的可以通过浏览器访问的程序的总称,叫做JavaWeb 。 Java是基于请求和响应开发的
web资源按照实现技术和呈现的效果不同,分为静态资源和动态资源
什么是web服务器: https://blog.csdn.net/HelloZEX/article/details/122810557
去官网下载需要使用的Tomcat版本对应的zip压缩吧,解压到需要安装的目录即可
bin 专门用来存放 Tomcat 服务器的可执行程序
conf 专门用来存放 Tocmat 服务器的配置文件
lib 专门用来存放 Tomcat 服务器的 jar 包
logs 专门用来存放 Tomcat 服务器运行时输出的日记信息
temp 专门用来存放 Tomcdat 运行时产生的临时数据
webapps 专门用来存放部署的 Web 工程。
work 是 Tomcat 工作时的目录,用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码,和 Session的钝化目录
第一种方式
找到 Tomcat 目录下的 bin 目录下的 startup.bat 文件,双击,就可以启动 Tomcat 服务器
打开浏览器,访问 http://localhost:8080
第二种方式
以命令行方式cd到 E:\apache-tomcat-8.5.38\bin,输入:catalina run , 发现Tomcat也成功启动
1)点击 tomcat 服务器窗口的 x 关闭按钮
2)把 Tomcat 服务器窗口置为当前窗口,然后按快捷键 Ctrl+C
3)找到 Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat
找到 Tomcat 目录下的 conf 目录,找到 server.xml 配置文件
把 web 工程的目录拷贝到 Tomcat 的 webapps 目录下即可
①、在webapps下新建目录book
②、放入静态页面
③、访问相应的地址 http://localhost:8080/book/pages/user/login.html
当我们在浏览器地址栏中输入访问地址如下:
http://ip:port/ ====>>>> 没有工程名的时候,默认访问的是 ROOT 工程。
例如:启动tomcat后访问localhost:8080,默认访问的是root工程下的index.html
当我们在浏览器地址栏中输入的访问地址如下:
http://ip:port/工程名/ ====>>>> 没有资源名,默认访问 index.html
1)Servlet是JavaEE规范之一。规范就是接口
2)Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Linstener
监听器
3)Servlet是运行在服务器上的一个Java程序,它可以接收客户端发送过来的请求并响应数据给客户端
demo演示如下:
1)新建web工程
2)编写HelloServlet类继承Servlet接口,并重写service方法
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
service方法是专门用来处理请求和响应的
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("HelloServlet程序被访问了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3)编写web.xml 配置HelloServlet程序的访问路径
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>com.atguigu.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
4)访问路径 http://localhost:8080/06_Servlet/hello
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1)编写一个类去继承 HttpServlet 类
2)根据业务需要重写 doGet 或 doPost 方法
3)到 web.xml 中的配置 Servlet 程序的访问地址
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post请求");
}
}
1)在重写Servlet的init方法时,参数列表中携带ServletConfig
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 HelloServlet init方法");
//1)可以获取 Servlet 程序的别名 servlet-name 的值
String servletName = servletConfig.getServletName();
System.out.println("servletName:"+servletName);
//2)获取初始化参数 init-param
String key = servletConfig.getInitParameter("key");
System.out.println(key);
//3)获取 ServletContext 对象
servletConfig.getServletContext();
}
<!-- initparam的配置 -->
<servlet>
<!--servlet-name 给Servlet起一个别名-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是Servlet程序的全类名-->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>key</param-name>
<param-value>i like reba</param-value>
</init-param>
</servlet>
2)也可以在非init方法中获取到ServletConfig
通过 ServletConfig servletConfig = getServletConfig() 获取到ServletConfig
通过代码可以看到 这个方法是由GenericServlet 提供的,再往上走,就是tomcat在创建servlet程序时,创建了ServletConfig对象
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求");
ServletConfig servletConfig = getServletConfig();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post请求");
}
}
【注意】但是此时,你如果重写了init方法,则必须调用父类的init方法,否则获取到的servletConfig 为null
什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,整个 web 工程。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = getServletConfig().getServletContext();
String username = servletContext.getInitParameter("username");
System.out.println("context-param 参数 username 的值是:" + username);
System.out.println( "当前工程路径:" + servletContext.getContextPath() );
System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
/*作为域保存数据*/
servletContext.setAttribute("houchen", "帅哥");
}
Cookie 是服务器通知客户端保存键值对的一种技术;当客户端有了Cookie之后,之后的每次请求都会携带cookie;
【注意】每个cookie的大小不超过 4kb
cookie是由服务器端进行创建,然后通知客户端保存cookie的
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
//1 创建 Cookie 对象
Cookie cookie = new Cookie("key4", "value4");
//2 通知客户端保存 Cookie
resp.addCookie(cookie);
//1 创建 Cookie 对象
Cookie cookie1 = new Cookie("key5", "value5");
//2 通知客户端保存 Cookie
resp.addCookie(cookie1);
resp.getWriter().write("Cookie 创建成功");
}
服务器端获取客户端的cookie只需要一行代码 :
Cookie[] cookies = req.getCookies();
方式一: 直接使用相同的key覆盖原来的cookie对象,调用 response.addCookie()通知客户端保存修改
Cookie cookie = new Cookie("key1","newValue1");
// 3、调用 response.addCookie( Cookie ); 通知 客户端 保存修改
resp.addCookie(cookie);
方式二:
先查找到需要修改的 Cookie 对象;调用 setValue()方法赋于新的 Cookie 值;调用 response.addCookie()通知客户端保存修改
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {
// 2、调用 setValue()方法赋于新的 Cookie 值。
cookie.setValue("newValue2");
// 3、调用 response.addCookie()通知客户端保存修改
resp.addCookie(cookie);
}
Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
Cookie cookie = new Cookie("life3600", "life3600");
cookie.setMaxAge(60 * 60); // 设置 Cookie 一小时之后被删除。无效
resp.addCookie(cookie);
resp.getWriter().write("已经创建了一个存活一小时的 Cookie");
Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
Session本质上就是一个接口 (HttpSession)
Session是一个会话,它是用来维护客户端和服务器之间关联的一种技术;每个客户端都有自己的一个Session会话,
session会话中,经常用来你保存用户登录之后的信息
创建和获取Session ,它们的api是一样的。
request.getSession()
第一次调用是:创建Session会话
第二次调用是:获取前面创建好的Session会话对象
isNew(); 判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。getId() 得到 Session 的会话 id 值。
session超时的理解
浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了,但服务器与客户端会产生一个新的会话,之前的session里的属性值全部丢失,产生新的sesssionId
public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
值为正数的时候,设定 Session 的超时时长。
负数表示永不超时(极少使用)
public int getMaxInactiveInterval()获取 Session 的超时时间
public void invalidate() 让当前 Session 会话马上超时无效
Session 默认的超时时长是多少! Session 默认的超时时间长为 30 分钟。 因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。
<session-config>
<session-timeout>30session-timeout>
session-config>
如果说。你希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做 以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。
<session-config>
<session-timeout>20session-timeout>
session-config>
如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设 置。 session.setMaxInactiveInterval(int interval)单独设置超时时长
Session 技术,底层其实是基于 Cookie 技术来实现
Filter 过滤器的使用步骤:
1、要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必 须是用户登录之后才允许访问
public class AdminFilter implements Filter {
/**
* doFilter 方法,专门用于拦截请求。可以做权限检查
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain
filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
} else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
4、web.xml配置
<filter>
<filter-name>AdminFilterfilter-name>
<filter-class>com.atguigu.filter.AdminFilterfilter-class>
filter>
Filter 的生命周期包含几个方法
FilterConfig 类见名知义,它是 Filter 过滤器的配置文件
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件
FilterConfig 类的作用是获取 filter 过滤器的配置内容
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.Filter 的 init(FilterConfig filterConfig)初始化");
// 1、获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
// 2、获取在 web.xml 中配置的 init-param 初始化参数
System.out.println("初始化参数 username 的值是:" + filterConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是:" + filterConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(filterConfig.getServletContext());
}
web.xml中,filter的配置
<filter>
<filter-name>AdminFilterfilter-name>
<filter-class>com.atguigu.filter.AdminFilterfilter-class>
<init-param>
<param-name>usernameparam-name>
<param-value>rootparam-value>
init-param>
<init-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost3306/testparam-value>
init-param>
filter>
精确匹配
<url-pattern>/target.jspurl-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
目录匹配
/admin/*
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
后缀名匹配
<url-pattern>*.htmlurl-pattern>
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.dourl-pattern>
以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.actionurl-pattern>
以上配置的路径,表示请求地址必须以.action 结尾才会拦截到