1.Javaweb
①Web应用程序是一种可以通过Web访问的应用程序。
②JavaWeb简介:
静态网页:
表现形式:网页中的内容是固定的、不会更新。
不一定没有动态元素。
所需技术:HTML、CSS。
动态网页:
表现形式:网页中的内容通过程序动态显示、自动更新(从数据库读出的)。
动态网页的动态指的是能与用户进行交互,比如登录时输入正确的用户名和密码,系统会提示登录成功。
所需技术:HTML、CSS、数据库、高级语言(Java、PHP)、JS、XML等。
2.Tomcat
①tomcat服务器,常见的web服务器。可以解析常见的标签语言。
是当今最流行的Servlet/JSP容器,免费、成熟、开源。
②WEB-INF是Java的WEB应用的安全目录。客户端无法访问此目录里的网页文件,只有服务器端才能访问。
index.jsp:默认被第一个访问的页面(在一个项目中),也可通过左下图方式修改。使用localhost:端口号访问。
Sources:可以管理项目的目录结构,并且能通过不同的颜色标识文件夹的用途!(有时候class类运行不起来,用之解决问题)
③修改虚拟路径(即本地访问网页的URL):Run--Edit Configurations--Deployment...然后修改Application context修改即可。
④一个Tomcat服务器上可以运行多个实例应用,但是每个实例应用之间要用不同的端口。
默认情况下,Tomcat的端口号为8080。
与其他服务器端口造成冲突,可修改默认端口号,在Tomcat--conf--server.xml文件中,将其中的8080更改成其他的端口号。
<Connector port="8080"
......
/>
3.JSP页面组成
JSP:全名为Java Server Pages,是一个简化的Servlet设计,JSP和Servlet都是在服务端执行的。
它实现了在Java当中使用HTML标签。
JSP是一种动态网页技术标准,也是JavaEE的标准。
其中:
①指令:
page指令:通常位于JSP页面的顶端,同一个页面可以有多个page指令。
<%@page 属性1="属性值1" 属性2="属性值1,属性值2"...%>
language:指定JSP页面使用的脚本语言,默认值是java。
import:通过该属性来引用脚本语言中使用到的类文件,默认值无。(即导入包)
contentType:用来指定JSP文件生成的页面所采用的编码方式,默认值是text/html,ISO-8859-1。
ISO-8859-1默认是英文,页面中不能出现中文。若是输入中文,会出现乱码。
contentType的charset是指服务器发给客户端时的输出内容编码,更常用。
pageEncoding是jsp文件本身的编码。
include指令:将一个外部文件嵌入到当前Jsp文件中,同时解析这个页面中的JSP语句。
taglib指令:使用标签库定义新的自定义标签,在JSP页面中启用定制行为。
②注释:
HTML的注释:
<!-- 我是注释,客户端在源代码里可以看见我。 -->
HTML注释注释不了JSP代码。
JSP的注释:
<%-- 我是JSP(服务端)注释.客户端啥都看不见哦。 --%>
ps:这是服务端注释,在客户端查看源代码时可以看见空行(注释的痕迹)。
JSP脚本中的注释:
<%
// 一行Java注释。
/*多行Java注释*/
%>
脚本注释也可以看到1行注释的痕迹(查看源代码时)。
③声明:
在JSP页面中定义变量或者方法。
<%! Java代码%>
④脚本:脚本中只能写Java代码表达。
<%
out.println("keep studying");
%>
在脚本中只能用Java注释/JSP注释。
⑤表达式
在JSP页面中执行的表达式。
<%= 表达式 %>// 表达式不以分号结束。
<%@ page contentType="text/html;charset=gbk" language="java" %>
<html>
<head>
<title>配置wuwu</title>
</head>
<body>
<h>啦啦啦,坚持下去。</h>
<!-- 我是HTML注释。 -->
<%-- 我是JSP注释。 --%>
<%
// 我是java单行注释。
/*
*我是Java多行注释。
*/
%>// 脚本注释。
<%!
String today = "learn it by heart and use it greatly";
%>
今天,我学到了<%= today %>;
2+3= <%= 2+3 %>
</body>
</html>
JSP最终是编译成Servlet来执行的,在编译前会生成一个Java类:Servlet本质也是一个java类。
-- JSP声明<%! ... %>会被用来生成Java类的成员变量,如int i=i+1; String str="张三";
-- JSP脚本<% ... %>会被用来生成JSP Service方法里面的方法代码,包括局部变量声明,脚本中带分号。
-- JSP表达式<%= 表达式 %>也会被用来生成输出的方法代码,例如out.print("你好"+str);
⑥JSP的页面周期:
第一次请求jsp页面时,首先被执行的方法是构造方法。第一次请求时,JSP引擎会把这个JSP文件转换成为一个Servlet。 Servlet是一个类,创建它的实例,就会调用Servlet的构造方法。
基础总结:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>九九乘法表</h1>
<%!
// 返回99乘法表对应的HTML代码,并且通过表达式调用。
// 方法1:
String print() {
String s ="";
for(int i=1;i<=9;i++) {
int k=0;
for(int j=1;j<=i;j++) {
k=i*j;
s += i+"*"+j+"="+k+" ";
}// 完成一次内层for循环,打印出一行。
s += "<br>";
}
return s;
}
// 方法2:
void print0(JspWriter out) throws IOException {
for(int i=1;i<=9;i++) {
int k=0;
for(int j=1;j<=i;j++) {
k=i*j;
out.println(i+"*"+j+"="+k+" ");
}
out.println("");
}
}
// JSP内置对象OUT,使用脚本方式打印乘法表。
%>
<%= print() %<!-- 有返回值的函数。 -->
<% print0(out); %><!-- 直接调用函数打印。 -->
</body>
</html>
4.内置对象简介:
JSP内置对象是Web容器创建的1组对象,不使用new关键字就可以使用。
<%
int[] value = {60,70,80};
for(int i:value) {
out.println(i);
}
%>
JSP的9大内置对象:
Web程序的请求响应模式:用户发送请求(request)、服务器给用户响应(response)。
如登录页面:点击登录向服务器发送请求,在请求对象中封装了用户名和密码。
服务器端接收用户的请求,判断用户名和密码后,给客户端发送响应页面。
缓冲区:Buffer,即内存的一块区域用来保存临时数据。
①out对象:是JspWriter类的实例,向客户端输出内容常用的对象。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>out内置对象</title>
</head>
<body>
<%
out.println("<h1>终南别业</h1>");
out.println("行到水穷处、坐看云起时。");
out.getBufferSize();// 返回缓存区总大小。
out.getRemaining();// 返回缓冲区剩余多少。
out.isAutoFlush();// 返回缓冲区满时,是自动清空还是抛出异常。
// out.clear();// 清除缓存区的内容,在flush之后调用会抛出异常。
// 在输出前若清除缓存区数据,则得不到输出内容。
out.flush();// 将缓存区的内容输出到客户端。
out.clearBuffer();// 清除缓存区的内存,在flush之后调用不会抛出异常。
int remain = out.getRemaining();
%>
缓冲区大小:<%= out.getBufferSize() %>
缓冲区剩余大小:<%= out.getRemaining() %>
是否自动清除缓冲区:<%= out.isAutoFlush() %>
清除后缓冲区剩余大小:<%=remain%>
<%
out.close();// 关闭输出流。
%>
</body>
</html>
①②③:
get与post:表单提交的两种方式。
<form name="表单名" action="动作" method="(提交方式)post/get">。
action:表示这个表单提供给哪个动作(后端内容)去处理。
get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据<=2KB。安全性较低但是效率比post方式高。
适合提交数据量不大,安全性不高的数据。比如:搜索、查询等功能。
post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。(比如:注册、修改、上传)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form method="get" action="dologin.jsp">
账户:<input type="text" name="usename" values="wjy"/>
密码:<input type="password" name="password" values="123456"/>
<input type="submit" value="登录">
</body>
</html>
......
<head>
<title>dologin</title>
</head>
<body>
<h>登录成功</h>
</body>
</html>
②request对象:
客户端请求信息被封装在request对象中,通过它能了解到客户的需求,然后做出响应,它是HttpServletRequest类的实例。
request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表单</title>
</head>
<body>
<form action="②request内置对象.jsp" method="post" />
用户:
<input type="text" name="usename">
爱好:
<input type="checkbox" value="看书" name="like">看书
<input type="checkbox" value="旅游" name="like">旅游
<input type="checkbox" value="运动" name="like">运动
<input type="checkbox" value="购物" name="like">购物
<input type="submit" value="提交">
<br>
<a href="②request内置对象.jsp?usename=测试URL传参数">测试URL传参数</a>
<!-- 没传爱好信息,抛出空指针异常。 -->
<!-- url传参默认字符集为utf-8,传递中文不会出现异常 -->
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>request内置对象</title>
</head>
<body>
<!-- 提交表单时,默认使用ISO...字符集,要想改变: -->
<%
request.setCharacterEncoding("utf-8");
// 用来确保发往服务器的参数以汉字的编码来提取,设置从request中取得的值或从数据库中取出的值。
// 将设置的请求字符编码设置为utf-8。
// 指定后可以通过request.getParameter()获取自己想要的字符串。
// 如果没有提前指定,则会按照服务器端默认的"iso-8859-1"来进行编码。
// 该方法只对post请求有效,对get请求无效。
// 对于get请求,应该在server.xml中指定:URIEncoding=utf-8。
// 注意:在执行request.setCharacterEncoding()之前不能执行request.getParameter()方法。
// 原因:应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容。
// 而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。
// 而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。
request.setAttribute("password","123456");
%>
用户名:<%= request.getParameter("usename") %>
获得密码属性的值:<%= request.getAttribute("password") %>
请求体的MIME类型:<%= request.getContentType() %>
请求文件的长度:<%= request.getContentLength() %>
请求的上下文路径:<%= request.getContextPath() %>
请求的真实路径:<%= request.getRealPath("request.jsp") %>
协议类型及版本号:<%= request.getProtocol() %>
服务器主机名:<%= request.getServerName() %>
服务器端口号:<%= request.getServerPort() %>
请求客户端的IP地址:<%= request.getRemoteAddr() %>
返回请求的字符编码方式:<%= request.getCharacterEncoding() %>
爱好:
<%
String[] s2 = request.getParameterValues("like");
if(s2!=null) {
for (String s0 : s2) {
out.println(s0);
}
}
%>
</body>
</html>
③response对象:包含了响应客户请求的有关信息,很少被直接使用,是HttpServletResponse类的实例。
此对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其他页面的response对象对当前页面无效。
请求重定向和请求转发区别:
请求转发:服务器行为,request.getRequestDispatcher("...").forward(request,response);
是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
请求重定向:客户端行为,response.sendRedirect("...");
等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>response内置对象</title>
</head>
<body>
<%
// 设置响应的MIMI类型。
response.setContentType("text/html;charset=UTF-8");
// 设置响应给客户端的内容的编码。
// 一般使用response.setContentType()方法来设置HTTP响应的编码,
// 同时指定了浏览器显示的编码,因为他在执行该方法通知服务器端以指定编码进行编码后,
// 会自动调用response.setCharacterEncoding()方法来通知浏览器以指定编码来解码,
// 使用此方法要在response.getWriter()执行之前或response提交之前。
response.setCharacterEncoding("utf-8");
PrintWriter outer = response.getWriter();
out.println("Where is zbw?");
outer.println("He is ...");// 总是提前于内置的out对象输出。
// 想要内置out对象出现在前面,就强制缓存输出。
out.println("Where is zbw?");
out.flush();
outer.print("He is ...");
// 请求重定向,让客户端发一个新请求,跳转。
// 用时要先注释掉out.flush();
response.sendRedirect("get.jsp");
%>
</body>
</html>
④session对象:
JSP的一个内置对象,是HttpSession类的实例。
session表示客户端与服务器的一次会话,会话保存在服务器的内存里。
一个会话指从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束。
session是一个特定的时间概念。
session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种方法知道这是一个客户,就需要session对象。
在每次会话中,有一个服务器创建的sessionid,每次客户端向服务端发送请求时,都会将此sessionid携带过去,服务端会对此进行校验。
除非本次会话的所有页面都关闭后,再重新访问某个Jsp或Servlet将会创建新的会话。
原有会话还存在,旧的sessionid存在于服务器端,等待销毁。
在服务器的内存中保存着不同用户的session,与用户一一对应。
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>session对象</title>
</head>
<body>
<h1>session对象的使用</h1>
<%
SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("usename","wjy");
// 使用指定名称将对象绑定到此会话。
session.setAttribute("password","you guess");
session.setAttribute("age",19);
session.setMaxInactiveInterval(12);
// 设置会话最长时间为12s。
%>
获取session创建时间:<%= s.format(d) %>
获取session的ID编号:<%= session.getId() %>
<% --返回创建时,JSP引擎为它设的唯一编号。 --%>
获取从session中获取用户名:<%= session.getAttribute("username") %>
<%--如果没有对象绑定在该名称下,则返回null。--%>
获取session中保存的属性:
<%
String[] ss = session.getValueNames();
for(String sss : ss) {
out.println(sss+" ");
}
%>
<%-- 返回一个包含此session的所有可用属性的数组。 --%>
获取会话的最长时间:<%= session.getMaxInactiveInterval() %>
</body>
</html>
12秒后编号改变:
session的销毁方式:
①调用session.invalidate()方法。
②session过期(超时)。
③服务器重新启动。
若在末尾调用第一个方法,即页面一执行完,会话就被销毁。
控制session对象的超时时间:
①session.setMaxInactiveInterval(时间);// 单位是秒。
②在web.xml中配置:
<session-config>
<session-timeout>
10// 单位是分钟。
</session-timeout>
</session-config>
⑤application对象:是ServletContext实例。
实现了用户间的数据共享,可存放全局变量。
开始于服务器的启动、终止于服务器的关闭。
在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
在任何地方对application对象属性的操作,都将影响其他用户对此的访问,它属于整个服务器。
类比静态类。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>application内置对象</title>
</head>
<body>
<%
application.setAttribute("usename","wjy");
// 使用指定名称将对象绑定到此会话。
application.setAttribute("password","you guess");
application.setAttribute("age","19");
%>
用户名是:<%= application.getAttribute("usename") %>
<!-- 运行完session页面后,这里就会得到用户名、密码、年龄等。 -->
密码是:<%= application.getAttribute("password") %>
<%-- 返回与此会话中指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。 --%>
application中的属性有:
<%
Enumeration<String> e = application.getAttributeNames();
while(e.hasMoreElements()) {
out.println(e.nextElement());
out.println("<br>");
}// 返回所有可用属性名的枚举
%>
JSP&Servlet引擎及版本号:<%= application.getServerInfo() %>
</body>
</html>
⑥page对象:
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是Java.lang.object类的实例。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>page内置对象</title>
</head>
<body>
返回此Object的类:
<%= page.getClass() %>
返回Object的hash码:
<%= page.hashCode() %>
把Object对象转换成String类的对象:
<%= page.toString()+" " %>
<!-- 打印出:文件存储路径+类名+hascode。 -->
判断此Object是否与指定的Object对象相等:
<%= page.equals(page) %>
</body>
</html>
⑦pageContext对象:
提供了对JSP页面内所有的对象及名字空间的访问。
可以访问到本页所在的session,也可以取本页面所在的application的某一条属性、相当于页面中所有功能的集大成者。
此对象的本类名也叫pageContext。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext内置对象</title>
</head>
<body>
返回当前页中的 Httpsession对象(session)的用户名/密码/年龄:
在当前位置包含①out内置对象.jsp文件:
<% pageContext.include("①out内置对象.jsp"); %>
<!-- 用时要注释掉out.close();!! -->
<%= pageContext.getSession().getAttribute("usename") %><br>
<%= pageContext.getSession().getAttribute("password") %><br>
<%= pageContext.getSession().getAttribute("age") %><br>
返回当前页的 ServletRequest对象 (request):
<%= pageContext.getRequest() %>
返回当前页的 ServletResponse对象(response):
<%= pageContext.getResponse() %>
返回当前页的Object对象(page):
<% Object p = pageContext.getPage(); %>
<%= p %>
<!-- 设置time属性及属性值: -->
<% pageContext.setAttribute("time",50); %>
在指定范围内取time属性的值:
<%= pageContext.getAttribute("time") %>// 50。
返回time属性的作用范围:
<%= pageContext.getAttributesScope("time") %>// 1。
</body>
</html>
......
<head>
<title>pageContext内置对象</title>
</head>
<body>
使当前页面重导到④session内置对象.jsp页面:
<% pageContext.forward("④session内置对象.jsp"); %>
</body>
</html>
⑧config对象:
a.config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的。
b.在Servlet的配置文件中,可以用一个或多个<init-param>标签为servlet配置一些初始化参数。
当servlet配置初始化参数之后,web容器在创建servlet实例对象时,自动将这些初始化参数封装到ServletConfig对象中。
并在调用servlet的init方法时,将ServletConfig对象传递给Servlet,即可通过该对象得到当前servlet的初始化参数信息。
此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。
c.如果希望jsp页面可以获得为自己本页面设置的配置信息,则必须通过为该jsp配置的路径来访问该页面,因为只有这样访问jsp页面才会让配置参数起作用。
d.config对象是ServletConfig的实例。
返回含有服务器相关信息的ServletContext对象:ServletContext getServletContext();
获取配置参数的方法:String getInitParameter(String name);
返回Servlet初始化所需所有参数的枚举:Enumeration getInitParameterNames();
e.实例(获得初始化参数)
在web.xml中配置Servlet时,可以配置一些初始化参数。
<servlet-mapping>
<servlet-name>Hello4</servlet-name>
<url-pattern>Servlet.initParam</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Hello4</servlet-name>
<servlet-class>Servlet.initParam</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>wjy</param-value>
</init-param>
<init-param>
<param-name>passowrd</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
JSP代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>init param</title>
</head>
<body>
<a href="../Servlet/initParam">get方法提交参数</a>
</body>
</html>
Servlet代码(获取初始化参数):
在Servlet中可以通过ServletConfig接口提供的方法来取得这些参数。
package Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Auther: wjy
* @Date: 2018/10/14 20:19
* @Description: 获得初始化参数。
*/
public class initParam extends HttpServlet {
private String username;
private String password;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("用户名:"+this.getUsername());
out.print("密码:"+this.getPassword());
}
@Override
public void init() throws ServletException {
// 获得初始化参数,并将值赋给username、password。
this.setUsername(this.getInitParameter("username"));
this.setPassword(this.getInitParameter("password"));
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
⑨exception对象:
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就会产生这个对象。
如果一个JSP页面要应用此对象,就必须把isErrorPage设为true(即只有异常处理页面才可以运行该对象),否则无法编译。
它实际上是java.lang.Throwable的对象。
web无法直接访问处理异常的页面!!
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="⑨exception内置对象.jsp"%>
<html><!-- 若发生异常,交给此页面处理。 -->
<head>
<title>Title</title>
</head>
<body>
<!-- 配置算术异常,即运行时异常 -->
<% System.out.println(100/0); %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html><!-- 有is...="true"才能使用exception对象 -->
<head>
<title>exception内置对象</title>
</head>
<body>
异常消息:<%= exception.getMessage() %><br>
异常简要描述:<%= exception.toString() %><br>
异常轨迹:<%= exception.getStackTrace() %><br>
</body>
</html>
5.Cookie详解
①http是超文本传输协议,也是无状态协议。
http协议具有无状态性,即服务器不记得你,不管你访问多少次。
当浏览器发送请求给服务器的时候,服务器响应客户端请求。
但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它刚才访问过。
②保存用户状态的两大机制:
Session、Cookie。
所谓Cookie(小甜饼),是Web服务器保存在客户端的一系列文本信息。
③Cookie的常见用途:
a.可以记录浏览记录。
b.可以保存登录记录(如n时间内自动登录)。
c."购物车"的处理,详情见 轻量级Java EE......之JSP/Servlet。
④Cookie的作用:
a.对特定对象的追踪。
b.保存用户网页浏览记录与习惯。
c.简化登录。
⑤使用Cookie:
创建Cookie对象:Cookie newCookie = new Cookie(String key, Object value);
写入Cookie对象:response.addCookie(newCookie);
读取Cookie对象:Cookie[] cookies = request.getCookies();
JSP中创建与使用Cookie:
void setMaxAge(int expiry):设置cookie的有效期,以秒为单位。
int getMaxAge():获取cookie的有效时间,以秒为单位。
void setValue(String value):创建cookie后,对cookie进行赋值。
String getName():获取cookie的名称。
String getValue():获取cookie的值。(名称对应值!!!)
⑥