请求响应图:
一:Servlet简介与体系结构
Servlet是使用JAVA语言编写的服务器端程序。Servlet主要运行在服务器端,并由服务器调用。
Servlet是单实例的,所以赢尽量少使用全局变量。
Servlet(接口)<——GenericServlet(抽象类)<——HttpServlet(抽象类)
二:Servlet实现方式:
方式一:实现Servlet接口,覆写其中的方法
url俩种访问方式:
第一种:访问资源:http://localhost/HelloServlet/hello/login.html
第二种:访问后台路径(直接与Servlet关联)
方式二:继承GeneriServlet类,覆写service方法
方式三:继承HttpServlet类
根据要求可以覆写doGet(xxx),doPost(xxx),service(xxx),如果覆写了service(xxx)方法,则执行service(xxx)方法,不执行doGet(xxx)和doPost(xxx)方法。
eg1: (1)<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <form action="loginURL" method="post"> 用户名:<input type="text" name="username"/> <br/><br/> 密码:<input type="password" name="pwd"/> <br/><br/> <input type="submit" value="登录"/> <input type="reset" value="重置"/> </form> </body> </html> (2)<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>欢迎页面</title> </head> <body> <h3>恭喜,登录成功!</h3> </body> </html> (3) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>失败页面</title> </head> <body> <h3>用户名或密码错误,请重新登录!</h3> <a href="http://localhost/HelloWeb/hello/login.html">点击跳转</a> </body> </html> (4)package org.afanti.com; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username=req.getParameter("username"); String pwd=req.getParameter("pwd"); if("lily".equals(username) && "123789".equals(pwd)){ req.getRequestDispatcher("/hello/welcome.html").forward(req,resp); }else{ req.getRequestDispatcher("/hello/fail.html").forward(req,resp); } } } (5)<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>HelloWeb</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>org.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/hello/loginURL</url-pattern> </servlet-mapping> </web-app>
三:Servlet配置方式
方式一:注解配置 @WebServlet(urlPatterns={“/xxx”})方式二:web.xml(部署描述符)配置
注意:<load-on-startup>属性的值为0或正数指 明当容器启动时就加载该Servlet,值越小,优先级越高;但是loadOnStartup的值为负数或没有此属性时则当请求该Servlet时,才加载该Servlet.
加载(实例化):Servlet容器创建Servlet实例;
初始化:该容器调用init()方法;
服务:如果请求Servlet,则容器调用service()方法;
销毁:销毁实例之前调用destroy()方法。
“服务器端跳转的路径”可以是绝对路径也可以是 相对路径。服务器端如果是绝对路径,要写成: /跳转路径 ("/"代表的是上下文根目录后的"/")如果客户端跳转的路径使用的是绝对路径,要写成:
/上下文根目录/跳转路径
六:JSP(Java Server Page)
1. JSP:Java服务页,JSP是一种动态页面技术。JSP页面存活于Web容器中。 JSP其实就是在HTML页面中嵌入Java代码。 JSP=HTML+Java代码 2 JSP与Servlet的关系是什么? Servlet是JSP的前身,本质上是一样的。 JSP页面在运行时由Web容器先转换成Servlet类, 然后编译,再运行编译好的.class文件, 最终转换成HTML代码发送给客户端浏览器。
在HTML页面中嵌入Java代码:
使用Scriptlet代码 1.<%! Java类、方法、全局变量(或常量) %> 2.<% Java代码(语句),局部变量 %>
3.<%=变量或常量%> // 输出内容
<%@page import="java.net.URLDecoder"%> <%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title></title> </head> <body> <% String username=request.getParameter("user"); // 获取请求参数名为user的参数值 if("tom".equals(username)){ %> <h3>欢迎Tom,你是我们的VIP用户!你抓老鼠很厉害~~~</h3> <% }else{ %> <h3>你是<%=username%>,不欢迎!!!</h3> <% } %> </body> </html>七:JSP四种属性范围
(1) page属性范围:
使用pageContext内置对象操作,但是习惯上将这种范围称为page范围。只在一个页面中保存属性,跳转之后无效
(2)request属性范围
在一个请求范围内保存属性,例如:服务器端跳转后想要让属性保存下来,则可以使用request属性范围。
(3)session属性范围( Session代表客户端与服务器端的一次会话,保存于服务器端。)
也就是属性可以在一个会话范围内保存,只要是 同一个会话,则无论是客户端跳转还是服务端跳转,都可以保存。
(4) application属性范围
将属性设置到服务器中,这样,所有会话都可以 访问该属性。不宜设置过多,因为会影响服务器性能。
八:Cookie与Session
1)Cookie: Cookie是Http header的一部分,其传输由HTTP协议控制; 要将Cookie发送到浏览器,需要调用HttpServletResponse的addCookie(cookie对象)方法;注意:. 在客户端每次向服务器端发送请求时都会将之前设置的Cookie随着头信息一起发送到服务器上; Cookie由服务器端生成,但保存于客户端。
(2)Cookie与Session关系:
在Cookie中保存着一个SessionId(在Tomcat中的这个Cookie名为JSESSIONID),这样用户在每次发出请求时都会将此SessionID发 送到服务器端,服务器端依靠此Cookie中保存着的SessionId来区分每一个不同的客户端。
eg1:
(1).
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Cookie</title> </head> <body> <% Cookie cookie=new Cookie("mycookie","Hello,this is my cookie!"); // 生成一个Cookie对象 response.addCookie(cookie); // 将该Cookie发送给客户端 %> </body> </html>(2).
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="java.util.Enumeration"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>获取所有的请求头信息(request headers)</title> </head> <body> <h3>所有的请求头信息如下:</h3> <% Enumeration<String> enumers=request.getHeaderNames(); // 获取所有的头信息名称 while(enumers.hasMoreElements()){ String headerName=enumers.nextElement(); // 获取当前的头信息名称 String headerValue=request.getHeader(headerName); out.println("<h4>"+headerName+"=============>"+headerValue+"</h4>"); // 输出到浏览器 } String sessionId=session.getId(); %> <h3>当前的SessionId是:<%=sessionId%></h3> </body> </html>