javaweb简介
静态网页与动态网页
静态网页
表现形式:网页中内容是固定,不会更新
技术: Html + CSS
动态网页
表现形式:网页中的内容通过程序动态显示的,自动更新。
安装tomcat
...
image.png
/work 可以删除不影响使用
可以手动创建一个jsp动态页面
WEB-INF目录结构
1, WEB-INF是java的web应用的安全目录,客户端访问不到,只有服务端可以访问的目录。
2,web.xml,项目部署文件 (配置默认启动页面... )
3,classes文件夹,防止 *.class文件。
4,lib文件夹,存放jar包。
使用idea 创建一个 javaweb项目,详细过程来这
https://www.cnblogs.com/xinruyi/p/9360282.html
项目虚拟路径: 默认的就是项目名。 也可以修改,我就不修改。
Jsp基础语法
Jsp页面元素
静态内容,注释, 声明,小脚本,表达式,指令。
Jsp指令
page指令 jsp文件第一行的
include指令
taglib指令
Jsp注释
<!-- 这个是html 注释,客户端查看源码可以看见-->
<%--这里是jsp的注释, 客户端查看源码不可见--%>
<% Jsp的脚本注释
// 单行注释
/**
* 多行注释
*/
在客户端中也看不见
%>
Jsp脚本
在JSP页面中执行的java代码。
<% java代码 %>
Jsp声明
在Jsp页面中定义变量或者方法。
<%! java 代码 %>
Jsp表达式
在Jsp页面中执行的表达式
<%= 表达式+ %>
<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>这是我的第一个 jsp 页面</h1>
<!-- 这个是html 注释,客户端查看源码可以看见-->
<%--这里是jsp的注释, 客户端查看源码不可见--%>
<%-- Jsp声明 --%>
<%!
String s = "小明";
int add(int x, int y) {
return x + y;
}
%>
<%-- Jsp 脚本 --%>
<%
out.print("这里是Jsp的脚本");
%>
<br>
<%-- Jsp表达式 --%>
你好哇,<%= s %>
<br>
3+7 = <%= add(3, 7) %>
</body>
</html>
Jsp页面声明周期
JspService()方法被调用来处理客户端的请求。对于每一个请求,Jsp引擎创建一个新的线程来处理该请求。如果多个同时请求Jsp文件,就创建多个线程,对应每个客户端。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。多线程也会带来同步问题,由于该Servlet一直在内存,响应很快。
每次请求都会Jsp重新编译字节码文件。
使用 Jsp 声明 和 Jsp表达式生成一个九九乘法表
<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>九九乘法表</h1>
<hr>
<%-- Jsp 声明 一个方法--%>
<%!
String result = "";
String exec() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
result += i + " * " + j + " = " + (i * j) + " ";
}
result += "<br>";
}
return result;
}
%>
<%= exec() %>
</body>
</html>
Jsp内置对象 image.png
客户端向web服务器发送 request,
web服务器向客户端发response.
request对象
客户端的请求信息被封装在request对象中,通过它才能了解客户的需求,然后做出响应,在完成客户端的请求之前,该对象一直有效。
request传递参数
<%--
Created by IntelliJ IDEA.
User: admin
Date: 2020/5/8
Time: 17:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>request对象</title>
</head>
<body>
<form action="reg.jsp" method="post">
<table>
<tr>
<td>名字</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox" value="read" name="favorite">读书
<input type="checkbox" value="movie" name="favorite">电影
<input type="checkbox" value="sport" name="favorite">运动
</td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
<br>
<br>
<%-- 通过 URL 传递参数 --%>
<a href="reg.jsp?username=李四">通过URL传递参数</a>
</body>
</html>
reg.jsp文件
<%-- 解决中文乱码问题,要跟传递参数的 requests.jsp 页面中的编码一致。--%>
<% request.setCharacterEncoding("UTF-8");%>
用户名:<%= request.getParameter("username") %>
<br>
爱好: <%
if (request.getParameterValues("favorite") != null) {
String[] favorites = request.getParameterValues("favorite");
if (favorites.length != 0) {
for (int i = 0; i < favorites.length; i++) {
out.println(favorites[i]);
}
}
}
%>
如果request传递参数过程中出现中文乱码问题。是因为前后台编码不统一,可以修改 tomcat/conf/server.xml 标签 加入
<Connector ......... URIEncoding="UTF-8"/>
request对象常用的方法:
请求体的MIME类型: <%= request.getContentType() %>
协议类型及版本号: <%= request.getProtocol() %>
服务器主机名: <%= request.getServerName() %>
服务器端口号: <%= request.getServerPort() %>
请求文件的长度: <%= request.getContentLength() %>
请求客户端的IP地址: <%= request.getRemoteAddr()%>
请求的真实路径: <%= request.getRealPath("requests.jsp") %>
请求的上下文路径: <%= request.getContextPath() %>
response对象
response对象包含了响应客户请求的有关信息,在Jsp中很少使用到它。有作用于,访问一个页面时,response对象只能对这次访问有效。
常用方法:
<%
response.setContentType("text/html;charset=utf-8"); // 设置响应的MIME类型
out.println("<h1>response内置对象</h1>");
out.println("<hr>");
out.flush();
PrintWriter writer = response.getWriter();
writer.println("这个是response对象生成的输出流outer对象");
response.sendRedirect("reg.jsp"); // 请求重定向
%>
请求重定向 :
客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会变保存,地址栏的url会改变。
请求转发:
服务器行为, request.getRequestDispatcher(“xx.jsp”).forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的url不会改变。
缓冲区
Buffer,就是内存的一块区域用来保存临时数据。
out对象
out对象是JspWriter类的实例,事项客户端输出内容常用的对象。
常用方法
void println() : 向客户端打印字符串
void clear(): 清除缓冲区内容, 如果在 flush()之后调用会抛出异常。
void clearBuffer(): 清除缓冲区内容。
void flush(): 将缓冲区内容输出到客户端
int getBufferSize(): 返回缓冲区字节数大小,如不设置缓冲区 = 0;
int getRemaining() : 返回缓冲区还剩下多少
boolean isAutoFlush(): 返回缓冲区满时,是自动清空还是抛出异常。
void close(): 关闭输出流。
get 与 post区别
表单的两种提交方式 , get 与 post
1, get 以明文的方式通过url 提交数据,数据在 url 中可以看到,安全性脚底,效率高,适合提交数量不大,安全性不高的数据 , 如 搜索, 查询等。
2,post:将用户提交的信息封装在HTML Header内,适合提交数据量大,安全性高的用户信息, 如 注册,上传等。
分别使用 get 和 post 请求方式简单模拟登录过程
<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form action="login.jsp" method="get">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
image.png
如果使用post 就不会出现用户名和密码的明文。
session
在服务器的内存中保存着不同用户的session.
1,session表示客户端与服务器的一次会话
2,Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
3,从上述定义中可以看到,session实际上是一个特定的时间概念。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Session_Page1</title>
</head>
<body>
<h1> Jsp内置 Session对象</h1>
<hr>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日-HH:mm:ss");
// 设置 Session 创建时间
Date date = new Date(session.getCreationTime());
session.setAttribute("name", "张三");
session.setAttribute("age", "21");
session.setAttribute("sex", "男");
session.setMaxInactiveInterval(10); // 设置session会话有效期 10 秒钟
%>
创建 Session的时间 是 <%= sdf.format(date)%> <br>
Session 的id 是 <%= session.getId()%> <br>
Session 中的user 是 <%= session.getAttribute("name")%> <br>
<a href="session_page2.jsp" target="_blank">跳转到Session_Page2页面</a>
</body>
</html>
jsp2
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Session_Page2</title>
Session的id : <%= session.getId() %> <br>
<%-- 当 session 过期之后, 获取到的 SessionId 为新值,一干属性也为 null--%>
作为参数传递的session 包含 <%
String[] names = session.getValueNames();
for (int i = 0; i < names.length; i++) {
out.print(names[i] + " ");
}
%>
</head>
<body>
</body>
</html>
session的生命周期
创建 : 当客户端第一次访问jsp时, 服务器会创建一个sessionid,每次客户端访问服务器时都会携带这个sessionId,服务器会对这个SessionId进行校验。
活动: 通过超链接打开新的页页面属于同一会话;当前页面没有全部关闭,打开新的窗口访问同一项目属于同一会话;如果全部关闭重新访问会产生新的会话,原有的会话依然存在于服务端,只是不会再被使用。
销毁 1, session.invalidate()方法 ; 2, session超时 ; 3, 服务器重启。
application对象
application 对象实现了用户间数据的共享,可存放全局变量。
application开始于服务器的启动,终止与服务器的关闭。
在不同时间或不同用户之间的连接中,可以对application的同一属性进行修改。
常用方法 :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Application内置对象</title>
</head>
<body>
<%
application.setAttribute("city", "北京");
application.setAttribute("postCode", "10000");
%>
application 设置的 city = <%= application.getAttribute("city") %> <br>
application 设置的 属性都有 <%
Enumeration<String> attr = application.getAttributeNames();
while (attr.hasMoreElements()) {
out.print(attr.nextElement() + " ");
}
%> <br>
JSP的引擎保本 <%= application.getServerInfo() %>
</body>
</html>
page对象
类似 Object
pageContext内置对象
pageCountext 对象体用了对JSP页面内所有的对象及名字空间的访问
pageContext对象可以访问到本页所在的session,也可以取本页面所载的application的某一属性值
pageContext相当于页面中所有功能的集大成者。
常用方法:
<body>
<h1>pageContext常用方法:</h1>
通过 pageContext 获取 Session <%= pageContext.getSession().getId() %> <br>
跳转页面 forward: <%
/* 跳转到新页面之后,地址栏上的地址不会发生变化 */
pageContext.forward("../login.jsp");
%>
include的使用: <%
pageContext.include("include.jsp");
%>
</body>
Config对象
config对象是在一个Servlet初始化时,Jsp引擎向他传递信息用的,包含Servlet初始化时需要用的参数以及服务器的有关信息。
常用方法:<br>
<%
/* 返回含有服务器相关信息的ServletContext对象*/
ServletContext servletContext = config.getServletContext();
/* 返回初始化参数的值*/
config.getInitParameter(String name) ;
/* 返回 Servlet初始化所需所有参数的枚举*/
Enumeration<String> initParameterNames = config.getInitParameterNames();
%>
Exception对象
测试异常类 , 需要在 顶部 天津爱 errorPage = "xxxx.jsp",表示要处理异常的类。
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="Exception.jsp" %>
<html>
<head>
<title>异常测试类</title>
</head>
<body>
<%
System.out.println(100 / 0); // 产生异常 ,一个算数异常
%>
</body>
</html>
处理异常类: 需要注意在顶部添加 isErrotPage =“true”,表示为处理异常的类。
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Exception内置对象</title>
</head>
<body>
<h1>Exception内置对象</h1>
打印异常信息 :<%= exception.getMessage() %> <br>
异常的完成信息 <%= exception.toString()%>
</body>
</html>
网友评论