Java Web总结
一、Servlet概述
1.1 动态网站技术
动态网站的特点
- 交互性
- 自动更新
- 随机性
主要技术
- PHP
- ASP
- JSP
1.2 Servlet基本知识
Servlet程序的基本特点
- 高效
- 方便
- 功能强大
- 良好的可移植性
第一个servlet程序
package chapter1;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "chapter1.MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//相应到客户端的文本类型为HTML
response.setContentType("text/html;charset=GBK");
//获取输出流
PrintWriter out = response.getWriter();
out.println("重定向和请求转发");
}
}
1.3 Servlet的生命周期(重要)
Servlet是运行在服务器上
Servlet生命周期是指创建Servlet实例到响应客户端的请求直至销毁的过程
Servlet生命周期的几个阶段
1、创建Servlet实例:装载Servlet,动态执行,可以在启动时装载,也可以在容器收到请求后装载
2、初始化(init()方法):调用init()方法对Servlet实例进行初始化。
注意:init()方法仅执行一次
3、服务(service()方法):在使用Http协议发送请求时,必须提供代表请求和响应的HttpServletRequest对象和HttpServletResponse对象
注意:当多个用户访问Servlet实例时,会分为多个线程访问此Servlet实例对象
4、销毁(destroy()方法):当收到一个请求或者被服务器卸载时,调用destroy()方法。
1.4 Servlet数据处理
直接上案使用Servlet处理表单数据,用户提交的数据正确时,输出”成功“,失败时提示”失败“
编写静态页面
<%--
Created by IntelliJ IDEA.
User: YZW
Date: 2022/10/22
Time: 9:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=GBK" language="java" %>
<html>
<head>
<title>登录</title>
<script language="JavaScript" type="">
function LoginSubmit() {
const user = document.Login.localName;
const pass = document.Login.password.value;
if (user == null || user == ""){
alert("请输入用户名");
}
else if (pass == null || pass == ""){
alert("请输入密码");
}
else document.Login.submit();
}
</script>
</head>
<body>
<form method="post" name="Login" action="LoginServlet">
<p align="left">
用户名:<input type="text" name="loginName" size="20" value="">
</p>
<p align="left">
密 码: <input type="password" name="password" size="20">
</p>
<p align="left">
<input type="button" value="提交" name="B1" onclick="LoginSubmit()">
<input type="button" value="重置" name="B2">
<input type="checkbox" value="Yes">
</p>
</form>
<a href="session.jsp">跳转到Session示例</a>
<a href="chapter3/CompareNum.jsp">跳转到CompareNum</a>
<a href="chapter4/login.jsp">跳转到login</a>
<a href="test/1.jsp">跳转到1.jsp</a>
<a href="test/3.jsp">跳转到3.jsp</a>
</body>
</html>
编写Servlet处理用户提交的数据
package chapter1;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "chapter1.LoginServlet")
public class LoginServlet extends HttpServlet {
public LoginServlet(){
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的编码字符为GBK(中文编码)
request.setCharacterEncoding("GBK");
//设置响应的文本类型为html,编码字符为GBK
response.setContentType("text/html;charset=GBK");
//获取输出流
PrintWriter out = response.getWriter();
String user = request.getParameter("loginName");
String pass = request.getParameter("password");
if ("admin".equals(user) && "123456".equals(pass)){
out.println("登录成功");
}else{
out.println("登录失败");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
1.5 重定向和请求转发(重要)
1.5.1 重定向
定义:重定向是指页面重新定位到某个新地址,之前的request失效,进入一个新的request,且跳转后浏览器地址栏内容变为新的指定地址。
方法:sendRedirect()
注意:sendRedirect()不仅可以重定向到当前应用程序的其他资源,还可以重定向到其他应用程序中的资源。
1.5.2 请求转发
定义:请求转发是指将请求再转发到另一页面,此过程依然在Request范围内,转发后浏览器地址栏内容不变。
方法:forward()
注意:该方法只能在同一个应用程序中的资源中可以使用。
1.5.3 sendRedirect()方法和forward()方法的区别(重要)
1、forward()方法只能将请求转发到同一个应用程序下的其他组件中。sendRedirect()方法则可以重定向到其他应用程序中的资源。
2、通过sendRedirect()方法重定向后浏览器地址栏内容会变为新的指定地址。forward()方法请求转发后浏览器地址栏内容不会改变。
3、forward()方法中被调用者和调用者共享同一个request和response对象。sendRedirect()方法中被调用者和调用者各自拥有独立的request和response对象,属于两个独立的过程。
二、Servlet会话跟踪
2.1 Cookie
定义:Cookie是服务器发给客户端的一小段文本,保存在浏览器所在客户端的内存或磁盘上。
Cookie的安全机制
1、cookie不会以任何形式在客户端被执行
2、浏览器会限制来自同一个网站的Cookie数目
3、单个Cookie长度是有限制的
4、浏览器限制了最多可以接收的Cookie数目
案例:使用Cookie保存用户名和密码,当用户再次登陆时,在相应的文本内容显示上次登录时输入的信息
编写用于接收用户输入的文件
package chapter2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "Login2Servlet")
public class Login2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String cookieName = "admin";
String cookiePwd = "123456";
//获取所有的cookie
Cookie[] cookies = request.getCookies();
String userName = "";
String password = "";
String isChecked = "";
//如果cookie数组不为null,说明之前设置过用户名和密码
//将用户名和密码取出来
if(cookies != null && cookies.length > 0){
//如果曾经设置过用户名和密码,那么ischecked应该是checked
isChecked = "checked";
for (int i = 0;i < cookies.length;i++){
//获取用户名
if (cookies[i].getName().equals(cookieName)){
userName = cookies[i].getValue();
}
//获取密码
if (cookies[i].getName().equals(cookiePwd)){
password = cookies[i].getValue();
}
}
}
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.println("<html>\n");
out.println("<head><title>登录</title></head>\n");
out.println("<body>\n");
out.println("<center>\n");
out.println("<form action='chapter2.CookieTest'" + "method='post'>\n");
out.println("姓名:<input type='text'" + "name='UserName' value='" + userName + "'><br/>\n");
out.println("密码:<input type='password'" + "name='Pwd' value='" + password + "'><br/>\n");
out.println("保存用户名和密码<input type='checkbox'" + "name='SaveCookie' value='Yes'" + isChecked + ">\n");
out.println("<br/>\n");
out.println("<input type=\"submit\">\n");
out.println("</form>\n");
out.println("</center>\n");
out.println("</body>\n");
out.println("</html>\n");
}
}
编写用于处理用户输入的信息的文件
package chapter2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "CookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie userCookie = new Cookie("userName",request.getParameter("UserName"));
Cookie pwdCookie = new Cookie("password",request.getParameter("Pwd"));
if(request.getParameter("SaveCookie") != null && request.getParameter("SaveCookie").equals("Yes")){
userCookie.setMaxAge(7*24*60*60);
pwdCookie.setMaxAge(7*24*60*60);
}else {
userCookie.setMaxAge(0);
pwdCookie.setMaxAge(0);
}
//将cookie发送给客户端
response.addCookie(userCookie);
response.addCookie(pwdCookie);
PrintWriter out = response.getWriter();
out.println("Welcome," + request.getParameter("UserName"));
}
}
2.2 Session
定义:Session用于跟踪客户端的状态。即在一段时间内单个客户端与web服务器之间的一连串交互过程称为一个会话。
2.2.1 session的创建
getSession()方法
getSession(Boolean create)方法
2.2.2 session的使用
存取数据的方法
setAttribute():保存数据
getAttribute():获取数据
返回的数据类型为Object,必要时需要进行类型转换
销毁Session
session.invalidate()
2.2.3 session的生命周期
1、客户端向服务器第一次发送请求时,request中并无sessionID
2、此时服务器端会创建一个Session对象,并分配一个sessionID。Session对象保存在服务器端,此时为新建状态调用session.isNew()返回true
3、当服务器端处理完毕后,会将sessionID通过response对象传回客户端,浏览器负责保存到当前进程中。
4、当客户端再次发送请求时,会同时将sessionID发送给服务器
5、服务器根据传递过来的sessionID将这次请求与保存在服务器端的Session对象联系起来。此时Session对象已不处于新建状态,调用session.isNew()返回false
6,循环3~5过程,直至session销毁
案例:用户在初始化界面输入一个值,点击”提交“按钮,会进入到第一个Servlet,第一个Servlet将输入的值分别保存在request和session中,在第二个session中从request和session对象中提取信息并展示
编写html页面
<%--
Created by IntelliJ IDEA.
User: YZW
Date: 2022/10/25
Time: 15:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Session示例</title>
</head>
<body>
<form method="post" action="s1">
<table>
<tr>
<td>输入数据:<input type="text" name="count"></td>
</tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>
编写FirstServlet.java
package chapter2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "FirstServlet")
public class FirstServlet extends HttpServlet {
public FirstServlet(){
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的编码字符为GBK
request.setCharacterEncoding("GBK");
//设置响应的文本类型为html,编码字符为GBK
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
//获取表单数据
String str = request.getParameter("count");
request.setAttribute("request_param",str);
HttpSession session = request.getSession();
session.setAttribute("session_param",str);
out.println("<a href='s2'>下一页</a>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
编写SecondServlet.java
package chapter2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "SecondServlet")
public class SecondServlet extends HttpServlet {
public SecondServlet(){
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取存放在request中的数据
Object obj1 = request.getAttribute("request_param");
String request_param = null;
if(obj1 != null){
request_param = obj1.toString();
}else {
request_param = "null";
}
//获取存放在session中的数据
HttpSession session = request.getSession();
Object obj2 = session.getAttribute("session_param");
String session_param = null;
if(obj2 != null){
session_param = obj2.toString();
}else{
session_param = "null";
}
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h3>请求对象中的参数:" + request_param + "</h3>");
out.println("<h3>session对象中的参数:" + session_param + "</h3></body></html>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
2.3 ServletContext接口
同一个上下文中的所有Servlet共享存在于其中的属性和信息
2.3.1 ServletContext生命周期
1、新的Servlet容器启动的时候,服务器端会创建一个ServletContext对象
2、在容器运行期间,ServletContext对象一直存在
3、当容器停止时,ServletContext的生命周期结束
2.3.2 ServletConfig和ServletContext之间的区别(重要)
ServletConfig作用于某个特定的Servlet
ServletContext作用于整个web应用,是所有Servlet的上下文环境
2.4 补充
-
使HttpSession失效的三种方式:1、关闭浏览器 2、调用session中invalidate()方法 3、等待session超时。
-
ServletContext的范围比session的范围更大
三、JSP基础
3.1 JSP特点
- 简单快捷
- 动态内容生成和显示相分离
- 组件重用
- 易于部署、升级和维护
3.2 JSP执行原理
1、客户端发送请求
2、容器接收到请求后检索对应的JSP页面(如果是第一次被请求,则容器将其翻译成一个Java文件,即Servlet
3、Servlet原代吗编译成字节码,即.class文件
4、最后把结果相应给客户端
JSP文件被修改后,容器能够检测到并重新翻译和编译
如果JSP页面出现错误,将不执行翻译操作
3.3 JSP基本结构
6类基本元素组成
- JSP指令
- JSP声明
- JSP表达式
- JSP脚本
- JSP动作
- JSP注释
四、JSP指令和动作
4.1 JSP指令
4.1.1 page指令
作用:导入包,指明输出内容类型、控制session
属性:import (import是page指令中唯一一个可以在JSP页面中多次出现的属性)
contentType
pageEncoding
4.1.2 include指令
作用:在当前JSP中包含其他文件,被包含的文件可以是JSP、HTML或文本文件
4.1.3 taglib指令
语法格式:
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4.2 JavaBean
4.2.1 JavaBean简介
特点:1、可重用 2、升级方便 3、不依赖于平台
广义上的JavaBean要满足以下需求:
- 是一个公有类、含有公有的无参构造方法
- 属性私有
- 属性具有公有的get和set方法
当JavaBean访问不存在的属性时,发生异常
4.3 JSP标准动作
其中<jsp:setProperty>
两种语法格式:
<jsp:setProperty name="id" property="属性名" value="值"/>
或
<jsp:setProperty name ="id" property="属性名" param="参数名"/>
注意:param属性不能和value属性一起使用
include指令和include标准动作的区别(重要)
1、include指令是把引用文件加入到当前JSP页面中一起编译,然后运行
include标准动作是引用文件和当前内容各自独立编译,然后将引用文件加入到当前页面中 运行。
2、include指令是静态引用,不会实时检查引用文件的内容变化
include标准动作是动态引用,会实时检查引用文件的内容的变化
五、JSP内置对象
5.1 常用的内置对象
out、request、response、session、application
无需定义,直接使用
5.2 JSP的4种作用范围(小->大)
pageContext
request
session
application
都具有getAttribute()和setAttribute()方法
5.3 补充
- request.getAttribute()和 request.getParameter()的区别
1、request.getParameter()获取的类型是String;request.getAttribute()获取的类型是Object。
2、request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;request.getAttribute()获取的是对象容器中的数据值/对象。
3、request.setAttribute()和request.getAttribute()可以发送、接收对象;request.getParamter()只能接收字 符串,
- 请写出常用的JSP内置对象,并简述它们的功能。
request:请求对象:代表的是来自客户端的请求
response:响应对象:代表的是对客户端的响应
session:会话对象:代表服务器与客户端所建立的会话
application:应用程序对象:负责提供应用程序在服务器中运行时的一些全局信息
out,输出对象:代表了向客户端发送数据的对象
exception:异常对象:用于处理JSP页面中的错误
config:页面的配置信息对象
page:表示JSP页面的当前实例
六、EL和JSTL
6.1 EL的基础语法
${EL表达式}
案例:在JSP页面中使用EL显示person类对象的数据
Person类
package chapter4;
public class JavaBean {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
JSP文件
<%--
Created by IntelliJ IDEA.
User: YZW
Date: 2022/10/28
Time: 10:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=GBK" language="java" %>
<html>
<head>
<title>JSP动作</title>
</head>
<body>
<jsp:useBean id="user" class="chapter4.JavaBean" scope="request"/>
<jsp:setProperty name="user" property="name" param="loginName"/>
<jsp:setProperty name="user" property="pwd" param="password"/>
用户名:<jsp:getProperty name="user" property="name"/>
<br/>
密码:<jsp:getProperty name="user" property="pwd"/>
</body>
</html>
6.2 EL隐含对象
根据作用域从小到大
pageScope -> requestScope -> sessionScope -> applicationScope
6.3 JSTL提供的标签库
- 核心标签库
- I18N标签库
- XML标签库
- SQL标签库
- EL函数库
6.4 补充
-
JSTL的全称为JavaServer Pages Standard Tag Libraray
-
EL是一种简洁的数据访问语言
-
<<c:when>>必须以<<c:choose>>作为父标签且必须在<<c:otherwise>>之前
-
<<c:otherwise>>必须在<<c:choose>>中
原文地址:http://www.cnblogs.com/hackerGhost/p/16870156.html