Java Web
Servlet
一个与平台无关的组件、运行在Servlet容器/Web应用服务器/Tomcat、负责与客户端进行通信
Servlet功能
创建并返回基于客户请求的动态HTML页面
与数据库进行通信
Servlet使用
Servlet本身是一个接口、如果一个类实现了这个接口、则这个类就具备了接受客户端请求及做出响应的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public class MyServlet implements Servlet {
public MyServlet() { System.out.println("我是无参构造、我创建对象"); }
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("报告后台工作人员、我Servlet已初始化"); }
@Override public ServletConfig getServletConfig() { return null; }
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { String id = servletRequest.getParameter("id"); servletResponse.setContentType("text/html;charset=UTF-8"); System.out.println("我已收到你传入的参数:" + id ); servletResponse.getWriter().write("您好用户、我们后台已收到您的反馈、请您耐心等待"); }
@Override public String getServletInfo() { return null; }
@Override public void destroy() { System.out.println("报告后台工作人员、我Servlet已经销毁"); } }
|
Servlet不能直接访问Servlet文件、只能通过映射方式来访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.dream.xiaobo.Servlet.MyServlet</servlet-class> </servlet>
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping>
</web-app>
|
1 2
| @WebServlet("/myServlet") public class MyServlet implements Servlet { }
|
Servlet生命周期
1、调用init方法完成初始化操作
2、调用service方法完成业务逻辑操作
3、关闭tomcat时、调用destory方法、释放当前对象所占资源
- 当浏览器访问Servlet时、Tomcat会查询当前Servlet实例化对象是否存在、如果不存在则通过反射机制动态创建对象、如果存在、则直接调用service方法执行业务逻辑操作
Servlet生命周期中方法的执行
无参构造:无参构造只调用一次、创建对象
init:init方法只调用一次、初始化对象
service:service方法被调用N次、执行业务逻辑
destory:destory只调用一次、释放对象
ServletConfig
ServletConfig是一个接口、该接口用来描述Servlet基本信息
ServletConfig中使用方法
getServletName():返回Servlet的名称、全类名
getInitParameter(String key):获取init参数值
getInitParameterNames()返回所有的InitParamter的name值、用于遍历init初始化参数
ServletContext
Servlet的上下文、是个Servlet的管理者
ServletConfig和ServletContext的区别
ServletConfig:作用于某个Servlet实例、每个Servlet都有对应的ServletConfig、局部对象
ServletContext:作用于整个Web应用、一个Web应用对应一个ServletContext、多个Servlet实例对应一个ServletContext、全局对象
Servlet层次结构
Servlet ——> GenericServlet ——> HttpServlet
HTTP常见的请求类型
GET:读取
POST:保存
PUT:修改
DELETE:删除
大致流程描述
GenenricServlet实现Servlet接口、同时为它的子类屏蔽不常用的方法、子类只需重写service方法即可
HttpServlet继承GenericServlet、根据请求类型进行分发处理、GET请求进入doGet方法、POST请求进入doPost方法
所以我们自定义的Servlet只需调用HttpServlet即可
大致工作流程演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| public class MyGenerisServlet 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 {
} @Override public String getServletInfo() { return null; }
@Override public void destroy() {
} }
public class MyHttpServlet extends MyGenerisServlet {
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; String method = httpServletRequest.getMethod(); switch (method){ case "GET": doGet(httpServletRequest,httpServletResponse); break; case "POST": doPost(httpServletRequest,httpServletResponse); break; } }
public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.getWriter().write("GET请求"); }
public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.getWriter().write("POST请求"); } }
@WebServlet("/TestServlet") public class TestServlet extends MyHttpServlet {
@Override public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.setContentType("text/html;charset=UTF-8"); httpServletResponse.getWriter().write("我收到您发的GET请求了"); }
@Override public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.setContentType("text/html;charset=UTF-8"); httpServletResponse.getWriter().write("我收到您发的POST请求了"); } }
|
JSP
JSP本质就是一个Servlet、JSP主要负责与用户交互、最终将页面呈现给用户 HTML+CSS+JS+java混合的文件
当服务器接受到一个后缀JSP请求、将请求交给JSP引擎去处理、每一个JSP页面第一次被访问时、JSP引擎会将它翻译成一个Servlet文件、在有Web容器调用Servlet完成响应
JSP脚本、执行Java逻辑代码
<% java代码 %>
JSP声明:定义java方法
<%! 声明方法 %>
JSP表达式:把Java对象直接输出到HTML页面中
<%= java变量 %>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public class MyJsp {
private int id; private String name; private int age;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public MyJsp(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <%@ page import="com.dream.xiaobo.jsp.MyJsp" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>小博来复习JavaWeb了</title> </head> <body> <h1 style="color: red">Hello Java Web</h1> <table> <tr style="color: red"> <th>编号</th> <th>姓名</th> <th>年龄</th> </tr> <% List<MyJsp> list = new ArrayList<MyJsp>(); list.add(new MyJsp(1,"小博",21)); list.add(new MyJsp(2,"小张",22)); list.add(new MyJsp(3,"小金",24)); for (int i = 0; i < list.size(); i++) { %> <tr style="color: blue"> <td><%=list.get(i).getId()%></td> <td><%=list.get(i).getName()%></td> <td><%=list.get(i).getAge()%></td> </tr> <% } %> </table> </body> </html>
|
JSP内置对象9个
方法 |
功能 |
request |
表示一次请求、HttpServletRequest |
response |
表示一次响应、HttpServletResponse |
pageContext |
页面上下文、获取页面信息、pageContext |
session |
表示一次会话、保存用户信息、HttpSession |
appliction |
表时当前Web应用、全局对象、保存所有用户共享信息、ServletContext |
config |
当前JSP对应的Servlet的ServletConfig对象、获取当前Servlet的信息 |
out |
向浏览器输出数据、JspWriter |
page |
当前JSP对应的Servlet对象、Servlet |
execption |
表示JSP页面发生的异常、Exception |
Request常用方法
方法 |
功能 |
String getParameter(String key) |
获取客户端传来的参数 |
void setAttribute(String key,Object value) |
通过键值对的形式保存数据 |
Object getAttribute(String key) |
通过key取出value |
RequestDispatcher gerRequestDispatcher(String path) |
返回一个RequestDispatcher对象、该对象的forward方法用于请求转发 |
String[] getParameterValues() |
获取客户端传来的多个同名参数 |
void setCharacterEncoding(String charset) |
指定每个请求的编码 |
HTTP请求状态码
- 200: 正常
- 403:无权限
- 404:资源找不到
- 400:请求类型不匹配
- 500:程序抛出异常
Response常用方法
sendRedirect(String path)重定向、页面之间的跳转
转发和重定向的区别
转发是将同一个请求传给下一个页面
重定向是创建一个新的请求传给下一个页面、之前的请求结束生命周期
转发:同一个请求在服务器之间传递、地址栏不变、服务器跳转
重定向:由客户端发送一次新的请求来访问跳转后的目标资源、地址栏发生改变、客户端跳转
简单实现登录模拟转发和重定向
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>请登录</title> </head> <body> <h1 style="color: aqua">请您登陆</h1> <form action="/testServlet" method="post"> 账号:<input type="text" name="userName" placeholder="请输入账号" /><br> 密码:<input type="text" name="passWord" placeholder="请输入密码" /><br> <input type="submit" value="登录"> </form> </body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @WebServlet("/testServlet") public class TestServlet extends HttpServlet {
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String userName = req.getParameter("userName"); String passWord = req.getParameter("passWord"); if(userName.equals("admin") && passWord.equals("xiaobo")) { req.getRequestDispatcher("/index.jsp").forward(req,resp); }else{ resp.sendRedirect("/login.jsp"); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <%@ page import="com.dream.xiaobo.jsp.MyJsp" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>小博来复习JavaWeb了</title> </head> <body> <h1 style="color: red">Hello Java Web</h1> <table> <tr style="color: red"> <th>编号</th> <th>姓名</th> <th>年龄</th> </tr> <% List<MyJsp> list = new ArrayList<MyJsp>(); list.add(new MyJsp(1,"小博",21)); list.add(new MyJsp(2,"小张",22)); list.add(new MyJsp(3,"小金",24)); for (int i = 0; i < list.size(); i++) { %> <tr style="color: blue"> <td><%=list.get(i).getId()%></td> <td><%=list.get(i).getName()%></td> <td><%=list.get(i).getAge()%></td> </tr> <% } %> </table> </body> </html>
|
Session(用户会话)
客户端和服务器之间发生的一系列连续的请求和响应的过程、打开浏览器进行操作到关闭浏览器的过程
会话状态
服务器和浏览器在会话过程中产生的状态信息、借助会话状态、服务器把属于同一次会话的一系列请求和响应关联系起来
实现会话的两种形式
Session常用的方法
方法 |
功能 |
String getId() |
获取SessionID |
void setMaxInactiveInterval(int interval) |
设置Session的失效时间、单位为秒 |
int getMaxInactiveInterval() |
获取Session的失效时间 |
void invalldate() |
设置Session立即失效 |
Object getAttribute(String key) |
通过键获取对应的数据 |
void removeAttribute(String key) |
通过键删除对应的数据 |
Session简单应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> </head> <body> <h1 style="color: red">请登录</h1> <form action="loginServlet" method="post"> <table style="color: blue"> <tr> <td> <input type="text" name="userName" placeholder="请输入用户用" /><br> </td> </tr> <tr> <td> <input type="password" name="passWord" placeholder="请输入密码" /> </td> </tr> <tr> <td> <input type="submit" value="登录" /> <input type="reset" value="重置" /> </td> </tr> </table> </form>
</body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class LoginServlet extends HttpServlet {
private String myUserName; private String myPassWord;
@Override public void init(ServletConfig config) throws ServletException { myUserName = config.getInitParameter("userName"); myPassWord = config.getInitParameter("passWord"); }
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().invalidate(); resp.sendRedirect("login.jsp"); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String userName = req.getParameter("userName"); String passWord = req.getParameter("passWord"); if(userName.equals(myUserName) && passWord.equals(myPassWord)){ HttpSession session = req.getSession(); session.setAttribute("userName", userName); req.getRequestDispatcher("/index.jsp").forward(req,resp); }else{ resp.sendRedirect("login.jsp"); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.dream.xiaobo.session.LoginServlet</servlet-class>
<init-param> <param-name>userName</param-name> <param-value>admin</param-value> </init-param> <init-param> <param-name>passWord</param-name> <param-value>xiaobo</param-value> </init-param> </servlet>
<servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
</web-app>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>首页</title> </head> <body> <h1 style="color: aqua">欢迎来到 <%= request.getSession().getAttribute("userName") %> 的世界</h1>
<a href="/loginServlet">登出</a> </body> </html>
|
Cookie
Cookie是服务器端在HTTP响应中附带传给浏览器的一文本文件、一旦浏览器保存某个Cookie、在之后的请求和响应中、会将Cookie来回传递、进而通过Cookie这个载体完成客户端和服务端的数据交互
Cookie创建
1 2
| Cookie cookie = new Cookie("name","xiaobo"); resp.addCookie(cookie);
|
Cookie读取
1 2 3 4 5 6
| <% Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies){ out.write(cookie.getName() + "\t" + cookie.getValue() + "</br>"); } %>
|
Cookie常用方法
方法 |
功能 |
void setMaxAge(int age) |
设置Cookie有效时间、单位为秒 |
int getMaxAge() |
获取Cookie的有效时间 |
String getName() |
获取Cookie的name |
String getValue() |
获取Cookie的value |
Session和Cookie的区别
Session
保存在服务器
保存的数据是Object
随着会话的结束而销毁
保存着重要信息
存储用户信息
1
| setAttribute("name","xiaobo");
|
服务器端:只要Web应用程序关闭、就销毁
客户端:只要关闭浏览器就销毁
Cookie
保存在浏览器
保存的数据是String
可以长期保存在浏览器中、与会话无关
保存不重要信息
存储用户信息
1
| addCookie(new Cookie("name","xiaobo"))
|
1 2 3
| Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies){ out.write(cookie.getName() + "\t" + cookie.getValue());
|
服务器端:服务器关闭时Cookie不被销毁
客户端:默认时只要浏览器关闭时就销毁、但是可以通过setMaxAge()方法设置有效期、一旦设置到了有效期就有设置的时间决定什么时候销毁了