XML
##1.概述
2.XML语法介绍
<?xml version="1.0" encoding="utf-8" ?>
<books>
<book sn="SN131411">
<name>时间简史</name>
<author>霍金</author>
<price>75</price>
</book>
<book sn="SN131412">
<name>java</name>
<author><![CDATA[
,,,,<<<<<<<我搞
]]></author> <!--把括号里面的识别成文本-->
<price>9.9</price>
</book>
<book sn="SN131413" name="吉利牌" author="哈哈哈" price="34"/>
</books>
3.XML解析技术
4.Dom4j的使用和jar包入库
jar包导入和目录结构
写入测试
public void Test01() throws DocumentException {
SAXReader saxReader = new SAXReader();
Document read = saxReader.read("src/books.xml");
System.out.println(read);
}
取值测试
public void Test02() throws DocumentException {
//读取books.xml文件
SAXReader saxReader = new SAXReader();
Document read = saxReader.read("src/books.xml");
//通过 Document对象 使用 getRootElement 读取根元素
Element rootElement = read.getRootElement();
//通过根元素获取标签对象
//elements 和 element 都是通过标签名查找子元素
List<Element> elements = rootElement.elements("book");
//遍历
for (Element element : elements) {
// asXML : 把标签对象转换成标签字符串
// System.out.println(element.asXML());
// 通过name标签名获取元素对象
String name = element.elementText("name");
// 同理
String price = element.elementText("price");
String author = element.elementText("author");
// 特殊的sn, attributeValue获取标签的属性值
String sn = element.attributeValue("sn");
System.out.println(new Book(sn,name,Float.valueOf(price),author));
}
}
Tomcat
1.JavaWeb概念
###1.请求和响应流程
###2.Web资源的分类
###3.常用的JavaWeb服务器
###4.Tomcat服务器和Servlet版本的关系
###5.目录介绍
##2.JavaWeb使用
1.运行成功
要是想运行成功,就不能关闭Tomcat的启动程序
2.Tomcat端口号修改
3.把Web部署到Tomcat中
4.手托页面和ip访问页面的区别
5.Tomcat的默认访问
6.idea整合Tomcat
7.目录介绍
8.导入jar包
一个一个添加然后一个一个的导入库
或者
9.用idea启动web项目和配置
名称可以修改成项目名;
url是项目运行的默认地址
修改热部署:代码有变化时更新页面
10.一些问题和修改
如图的 url 中的 servlet 是项目的名称 , 如果url不使用这样,那么看第二张图,的web下面的页面文件将无法加载和显示,因为路径名不正确,修改方式为第三张图:
先打开tomcat部署,打开部署,选择当前项目的启动工件(就是图片里蓝色的),如果不进行修改,那么默认的url访问路径就是这个一长串的工件名称,但是你的项目名不是这个,所以就要修改 , 那么就需要在:“应用程序上下文”那一框修改:成图中这样子。
Servlet
1.Servlet的介绍
###1.什么是Servlet
2.实现servlet程序
还有问题,在接下来还需要导入tomcat的lib库到该项目模块里面
创建程序完成,接下来开始测试:
测试类
package Hello;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("终于找到你 !!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
然后要在web.xml里面进行配置
<servlet>
<!--类别名-->
<servlet-name>HelloServlet</servlet-name>
<!--全类名-->
<servlet-class>Hello.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--对类别名的配置-->
<servlet-name>HelloServlet</servlet-name>
<!--工程路径下面的-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.url如何定位到servlet程序进行访问
4.servlet的生命周期
package Hello;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1.构造");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.使用: 终于找到你 !!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4.销毁");
}
}
5.Servlet整个类的继承体系
2.Servlet的使用
1.请求的分发处理
在java里请求都是大写的GET 和 POST
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.使用: 终于找到你 !!!");
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
System.out.println(method);
if("GET".equals(method)){
System.out.println("GET请求");
}else if("POST".equals(method)){
System.out.println("POST请求");
}
}
2.通过继承HttpServlet实现程序
public class HttpHello 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响应");
}
}
3.使用idea创建servlet程序
右键的新建里面就有Servlet,需要导入lib库,同时需要设置项目结构的facet页面下面的根源要勾上src。
idea生成的servlet会自动生成doget和dopost方法 以及在web.xml里自动配置
##3.ServletConfig的使用
###1.使用
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("HelloServlet的别名是: "+servletConfig.getServletName());
System.out.println("它的init-param: "+servletConfig.getInitParameter("username"));
System.out.println(servletConfig.getServletContext());//打印对象
}
2.类的说明
如果重写了init方法,需要把super方法写上
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("重写了init,然后还用super保证 父类的config的保存操作不会丢失");
}
4.ServletContext类
1.干什么的
2.获取配置值和工程路径,存储数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取context-param里面的值
ServletContext context = getServletConfig().getServletContext();
String namespace = context.getInitParameter("namespace");
System.out.println("servletcontext的namespace: "+namespace);
// 获取当前工程路径
System.out.println("获取当前工程路径: "+context.getContextPath());
System.out.println("获取当前工程绝对路径: "+context.getRealPath("/"));
}
存储数据的展示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("下面是1的页面");
ServletContext context = getServletContext();
System.out.println("保存之前的: "+context.getAttribute("key1"));
context.setAttribute("key1","value1");
System.out.println("保存之后的: "+context.getAttribute("key1"));
System.out.println("别的页面设置的context :"+context.getAttribute("key2"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println("下面是2的页面");
context.setAttribute("key2","value2");
System.out.println("保存之后的: "+context.getAttribute("key1"));
System.out.println("别的页面设置的context :"+context.getAttribute("key2"));
}
5.HTTP协议
1.请求的HTTP协议的格式
GET请求:
POST的请求
2.常用的请求头
3.哪些是get请求,哪些是post
4.响应的HTTP协议格式
5.常见的响应码
6.MIME类型说明
6.HttpServletRequest类
1.常用方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("获取请求的资源路径: "+request.getRequestURI());
System.out.println("获取请求资源的绝对路径 "+request.getRequestURL());
System.out.println("获取客户端的ip地址 "+request.getRemoteHost());
System.out.println("获取请求头 "+request.getHeader("Accept"));
System.out.println("获取请求的方式 "+request.getMethod());
}
2.获取客户端发来的请求参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("爱好:"+ Arrays.asList(hobby));
}
3.POST请求的中文乱码问题
解决:
private void hh(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("爱好:"+ Arrays.asList(hobby));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); //解决方法,设置成UTF-8
System.out.println("------------post--------");
hh(req);
}
4.请求的转发
Servlet1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 查看材料
String username = request.getParameter("username");
System.out.println("Servlet1的查看材料 :"+username);
// 给材料盖章
request.setAttribute("key1","1好了");
// 问路:Servlet2怎么走
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
// 开始走路
requestDispatcher.forward(request,response);
}
Servlet2
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 查看材料
String username = request.getParameter("username");
System.out.println("Servlet2的查看材料 :"+username);
// 查看servlet1的章
Object key1 = request.getAttribute("key1");
System.out.println("Servlet1是否盖章: "+key1);
// 实现自己的业务
System.out.println("实现Servlet2的业务,再见");
}
5.base标签的作用
6.Web中的路径问题
7.Web中“/”的意义
##7.HttpServletResponse类
1.两个输出流的说明
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 往客户端返回字符串
PrintWriter writer = response.getWriter();
writer.write("return something!!!");
}
2.中文乱码问题(一)
修改:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 往客户端返回字符串
response.setCharacterEncoding("UTF-8");
// 通过响应头来修改浏览器也是用UTF-8
response.setHeader("Content-Type","text/html;charset-UTF-8");
PrintWriter writer = response.getWriter();
writer.write("你好啊你好啊");
writer.write("return something");
}
页面源代码查看,已看到响应头属性改变
3.乱码解决方案(二)
4.请求重定向
response1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("曾到此一游----response1");
//设置响应状态302(重新定向)
response.setStatus(302);
// 设置响应头,声明新地址在哪
response.setHeader("Location","http://localhost:8080/servlet/response2");
}
response2
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("response2 run!!!");
}
5.请求重定向(二)
JSP
1.什么是JSP
模仿servlet传递页面数据的过程
public class PringHtml extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 模仿servlet传递页面数据的过程
// 通过响应流回传html页面数据
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write("<html lang=\"en\">\n");
writer.write("<head>\n");
writer.write("<meta charset=\"UTF-8\">\n");
writer.write(" <title>Title</title>\n");
writer.write("</head>\n");
writer.write("<body>\n");
writer.write("这是html页面\n");
writer.write("</body>\n");
writer.write("</html>\n");
}
}
JSP传输
创建和访问
##2.JSP页面的本质
本质上是Servlet程序:
在页面加载时,服务器资源文件下就会出现对应的java程序
3.JSP的三种语法
1.page指令
2.脚本
声明脚本
####表达式脚本
代码脚本
与页面语句混合使用 : 非常灵活
源代码
##4.JSP的三种注释
##5.JSP九大内置对象
6.四大域对象
scope
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
//往四个域分别保存数据
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
pageContext是否有值: <%=pageContext.getAttribute("key")%><br>
request 是否有值:<%=request.getAttribute("key")%><br>
session是否有值:<%=session.getAttribute("key")%><br>
application是否有值;<%=application.getAttribute("key")%><br>
<%
request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>
scope2
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope2.jsp页面</h1>
pageContext是否有值: <%=pageContext.getAttribute("key")%><br>
request 是否有值:<%=request.getAttribute("key")%><br>
session是否有值:<%=session.getAttribute("key")%><br>
application是否有值;<%=application.getAttribute("key")%><br>
</body>
</html>
7.JSP中的out和response的getWriter区别
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.write("out1输出\r\n");
out.flush();
out.write("out2输出\r\n");
response.getWriter().write("response1输出\r\n");
response.getWriter().write("response2输出\r\n");
%>
</body>
</html>
问题:write里面只能写字符串,如果写了int类型的,则会输出乱码或者空白。。。不会输出数字
print可以输出任意的数据类型
##8.JSP的常用标签
1.静态包含
2.动态包含
主页面
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br>
主体信息<br>
<%@include file="front.jsp"%>
<jsp:include page="front.jsp">
<jsp:param name="key" value="abc"/>
<jsp:param name="password" value="12233456"/>
</jsp:include>
</body>
</html>
底部页面
<html>
<head>
<title>Title</title>
</head>
<body>
<br>
底部信息<br>
修改底部<br>
获取从主页面创建的数值 :<%=request.getParameter("password")%>
</body>
</html>
底层原理
3.转发
9.请求转发
代码演示
jsp代码
#Listener监听器
主要使用的
public class Listener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("创建成功");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("销毁成功");
}
}
Cookie 和 Session
Cookie
1.什么是Cookie
2.Cookie的创建
public class CookieServlet extends BaseServlet {
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创建成功");
}
}
3.服务器如何获取Cookie
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
resp.getWriter().write(cookie.getName()+" "+cookie.getValue()+"<br>");
}
}
遍历查找需要的Cookie,所以说要创建一个Utils工具类
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
Cookie cookie = cookieUtils.findCookie("key4", cookies);
if (cookie!=null){
resp.getWriter().write(cookie.getName()+" "+cookie.getValue());
}
}
public Cookie findCookie(String name , Cookie[] cookies){
if(name==null||cookies==null||cookies.length==0)return null;
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
4.Cookie值的修改
方案1:
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 创建Cookie对象
Cookie cookie = new Cookie("key4", "newValue4");
//2 通知客户端保存Cookie
resp.addCookie(cookie);
resp.getWriter().write("Cookie修改成功");
}
方案2:
Cookie[] cookies = req.getCookies();
Cookie cookie = cookieUtils.findCookie("key4", cookies);
if (cookie!=null){
cookie.setValue("new2Value4");
resp.addCookie(cookie);
}
5.Cookie的生命控制
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("defaultLift","defaultLift");
/*
* 设置存活时间:
* 负数:默认值,服务器关了就删除
* 0:立刻删除
* 其他:单位秒
*
* */
cookie.setMaxAge(4);
resp.addCookie(cookie);
}
6.Cookie的有效路径设置
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("Path1","Path1");
cookie.setPath(req.getContextPath());
resp.addCookie(cookie);
resp.getWriter().write("创建了一个带有Path路径的cookie");
}
7.练习1:免用户登录
public class LoginServlet extends BaseServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if("admin".equals(username)&&"123456".equals(password)){
System.out.println("登录成功");
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*60);
resp.addCookie(cookie);
}else {
System.out.println("登陆失败");
}
}
}
第一次登录:
再次登录:
Session
1.Session会话
2.Session的创建和获取
public class SessionServlet extends BaseServlet{
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建和获取session对象
HttpSession session = req.getSession();
// 判断是不是第一次
boolean isNew = session.isNew();
// 获取信息
String id = session.getId();
resp.getWriter().write("session的ID是:"+id+"<br>");
resp.getWriter().write("是不是第一次创建的: "+isNew);
}
}
3.Session域的数据存取
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
}
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key1 = req.getSession().getAttribute("key1");
resp.getWriter().write("从key1中获取的数据:"+key1.toString());
}
###4.Session的生命周期控制
<!-- 可以修改所有的session的默认超时时常都是20分钟-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
三秒超时
超时后就会清除session
在3秒内无法创建
3秒后就可以创建新的session了
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setMaxInactiveInterval(3);
int maxInactiveInterval =session.getMaxInactiveInterval();
resp.getWriter().write("现在设置后的Session的潮湿时常: "+maxInactiveInterval+"秒<br>");
}
5.浏览器和Session关联的技术内幕
客户端
中间操作
服务器
Filter过滤器
1.什么是Filter
2.初体验(权限检查)
拦截流程,首先设置所以admin路径下的页面都拦截 : 就是说当用户访问admin下的任意页面,都需要跳转到后台的Filter程序,该程序检测session域中用户是否存在,存在就放行,否则就跳转到登录页面实现用户登陆
如果没有登陆,就跳转到登陆页面
拦截的实现
package Filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@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");
if(user == null){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}else{
filterChain.doFilter(servletRequest,servletResponse);//放行
}
}
@Override
public void destroy() {
}
}
Web.xml配置拦截路径
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>Filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<!-- 配置拦截路径 http://ip:port/工程路径/-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
调试
3.Filter的生命周期
4.FilterConfig类
5.FilterChain过滤器链
Filter1
public class Filter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter1前置");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Filter1后置");
}
@Override
public void destroy() {
}
}
Filter2
public class Filter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter2前置");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Filter2后置");
}
@Override
public void destroy() {
}
}
xml
<filter>
<filter-name>Filter1</filter-name>
<filter-class>Filter.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/hh.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>Filter2</filter-name>
<filter-class>Filter.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/hh.jsp</url-pattern>
</filter-mapping>