一, Servlet
1.1,servlet 简介
Servlet(Server Applet)是 Java Servlet 的简称, 称为小服务程序或服务连接器, 用 Java 编写的服务器端程序, 具有独立于平台和协议的特性, 主要功能在于交互式地浏览和生成数据, 生成动态 web 内容. 其实 Servlet 就是 Java 语言实现的一个接口, Servlet 运行于支持 Java 的应用服务器中. 从原理上讲, Servlet 可以响应任何类型的请求, 但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器.
1.2 实现过程
1. 客户端发送请求至服务器端;
2. 服务器将请求信息发送至 Servlet;
3.Servlet 生成响应内容并将其传给服务器. 响应内容动态生成, 通常取决于客户端的请求;
4. 服务器将响应返回给客户端.
1.3servlet 九大内置对象
request 对象
该对象封装了用户提交的信息, 通过调用该对象相应的方法可以获取封装的信息, 即使用该对象可以获取用户提交信息. 客户端的请求参数都被封装到这个对象里面
2.response 对象
对客户的请求做出动态的响应, 向客户端发送数据.
3.session 对象
1. 什么是 session:session 对象是一个 JSP 内置对象, 它在第一个 JSP 页面被装载时自动创建(Web 容器创建的, 使用者直接使用即可), 完成会话期管理.
从一个客户打开浏览器并连接到服务器开始, 到客户关闭浏览器离开这个服务器结束, 被称为一个会话. 当一个客户访问一个服务器时, 可能会在这个服务器的几个页面之间反复连接, 反复刷新一个页面, 服务器应当通过某种办法知道这是同一个客户, 这就需要 session 对象.
aplication 对象
1.什么是 application:
服务器启动后就产生了这个 application 对象, 当客户在所访问的网站的各个页面之间浏览时, 这个 application 对象都是同一个, 直到服务器关闭. 但是与 session 不同的是, 所有客户的 application 对象都是同一个, 即所有客户共享这个内置的 application 对象.
2.application 对象常用方法:
(1)public void setAttribute(String key,Object obj): 将参数 Object 指定的对象 obj 添加到 application 对象中, 并为添加的对象指定一个索引关键字.(这个在 Web 开发中很创建, 可以通过与对象进行转发, 达到数据共享)
(2)public Object getAttribute(String key): 获取 application 对象中含有关键字的对象.
out 对象
out 对象是一个输出流, 用来向客户端输出数据. out 对象用于各种数据的输出. 可以直接输出到前端页面中.
page java.lang.Object
对应 this 关键字. JSP 网页本身
page 对象是当前页面转换后的 Servlet 类的实例. 从转换后的 Servlet 类的代码中, 可以看到这种关系:
Object page = this;
在 JSP 页面中, 很少使用 page 对象.
7.config
javax.servlet. ServletConfig 的实例, 该实例代表该 JSP 的配置信息. 常用的方法有 getInitPararneter(String paramNarne) 及 getInitPararneternarnes() 等方法. 事实上, JSP 页面通常无须配置, 也就不存在配置信息. 因此, 该对象更多地在 Servlet 中有效.
exception java.lang.Throwable 的实例
该实例代表其他页面中的异常和错误. 只有当页面是错误处理页面, 即编译指令 page 的 isErrorPage 属性为 true 时, 该对象才可以使用. 常用的方法有 getMessageO 和 printStackTraceO 等.
pageContext
javax.servlet.jsp.PageContext 的实例, 对象直译时可以称作 "页面上下文" 对象, 代表的是当前页面运行的一些属性, 通过此对象可以拿到其他 8 大对象, 使用该对象可以访问页面中的共享数据. 常用的方法有 getServletContextO 和 getServletConfigO 等.
- // 使用 pageContext 设置属性, 该属性默认在 page 范围内
- pageContext. setAttribute ("page" , "hello") ;
- // 使用 request 设置属性, 该属性默认在 request 范围内
- request. setAttribute ("request" , "hello");
- // 使用 pageContext 将属性设置在 request 范围中
- pageContext.setAttribute("request2" , "hello" , pageContext.REQUEST_SCOPE);
- // 使用 session 将属性设置在 session 范围中
- session.setAttribute("session" , "hellosession"; )
- // 使用 pageContext 将属性设置在 session 范围中
- pageContext.setAttribute("session2" , "hello" , pageContext.SESSION_SCOPE);
- // 使用 application 将属性设置在 application 范围中
- application. setAttribute ("app" , "hello") ;
- // 使用 pageContext 将属性设置在 application 范围中
- pageContext.setAttribute("app2" , "hello" , pageContext.APPL 工 CATION_SCOPE) ;
1.4 四个作用域
1.application: 全局作用范围, 整个应用程序共享, 就是在部署文件中的同一个 webApp 共享, 生命周期为: 应用程序启动到停止.
2.session: 会话作用域, 当用户首次访问时, 产生一个新的会话, 以后服务器就可以记住这个会话状态. 生命周期: 会话超时, 或者服务器端强制使会话失效.(一个简单的应用就是可以动态的获取登录后的用户名称)
3.request: 请求作用域, 就是客户端的一次请求.
4.page: 一个 JSP 页面.
1.5 servlet 简单案例 - 用户登录, 动态获取用户名, 显示欢迎信息
1. 下载的 html 页面
- <!DOCTYPE HTML>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>
- 下载案例
- </title>
- </head>
- <body>
- <a href="/response/ServletDownload?filename = 曾惜 - 讲真的. mp3">
- 曾惜 - 讲真的. mp3
- </a>
- </body>
- </HTML>
2.servlet 后台逻辑
- package com.lyg.servlet.download;
- import javax.servlet.ServletContext;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- 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.InputStream;
- import java.NET.URLEncoder;
- @WebServlet("/ServletDownload")
- public class ServletDownload extends HttpServlet {
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // 获取文件名
- String filename = request.getParameter("filename");
- // 获取 servletcontext 对象
- ServletContext servletContext = getServletContext();
- // 设置响应头
- String mineType = servletContext.getMimeType(filename);
- response.setHeader("content-type",mineType);
- // 告诉浏览器是打开还是保存, 并设置下载后的文件名
- response.setHeader("content-disposition","attachment;filename="+filename);
- String userAgent = request.getHeader("user-agent");
- filename = URLEncoder.encode(filename, "utf-8");
- // 创建输入流, 读入目标文件
- InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/elements/"+filename);
- byte []chars=new byte[1024*8];
- // 创建一个 ServletOutputSteam 对象
- ServletOutputStream outputStream = response.getOutputStream();
- int len;
- while ((len=inputStream.read(chars))!=-1){
- outputStream.write(chars,0,len);
- }
- inputStream.close();
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- this.doPost(request,response);
- }
- }
二, jsp
2.1 jsp 简介
JSP 全名为 Java Server Pages, 中文名叫 java 服务器页面, 其根本是一个简化的 Servlet 设计, 它 [1] 是由 SUN 公司倡导, 许多公司参与一起建立的一种动态网页技术标准. JSP 技术有点类似 ASP 技术, 它是在传统的网页 HTML 文件 (.htm,.HTML) 中插入 Java 程序段 Scriptlet)和 JSP 标记(tag), 从而形成 JSP 文件, 后缀名为(*.jsp). 用 JSP 开发的 Web 应用是跨平台的, 既能在 Linux 下运行, 也能在其他操作系统上运行.
它实现了 HTML 语法中的 java 扩展 (以 <%, %> 形式).JSP 与 Servlet 一样, 是在服务器端执行的. 通常返回给客户端的就是一个 HTML 文本, 因此客户端只要有浏览器就能浏览.
JSP 技术使用 Java 编程语言编写类 xml 的 tags 和 scriptlets, 来封装产生动态网页的处理逻辑. 网页还能通过 tags 和 scriptlets 访问存在于服务端的资源的应用逻辑. JSP 将网页逻辑与网页设计的显示分离, 支持可重用的基于组件的设计, 使基于 Web 的应用程序的开发变得迅速和容易. JSP(JavaServer Pages)是一种动态页面技术, 它的主要目的是将表示逻辑从 Servlet 中分离出来. 他的本质上还是一个 Servlet.
2.2 page 指令
1. 包含选项
import 使一个 JAVA 导入声明被插入到最终页面文件.
contentType 规定了生成内容的类型. 当生成非 HTML 内容或者当前字符集 character set 并非默认字符集时使用.
errorPage 处理 HTTP 请求时, 如果出现异常则显示该错误提示信息页面.
isErrorPage 如果设置为 TRUE, 则表示当前文件是一个错误提示页面.
isThreadSafe 表示最终生成的 servlet 是否安全线程(threadsafe).
2. 语法
1.<%@ include file="somefile.jsp" %>: 将一个页面内容包含在一个页面中
<%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>: 引入标签库
3.jsp 和 servlet 综合应用 --- 登录案例
登录后台的逻辑
- package com.lyg.servlet.login;
- 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.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- @WebServlet("/LoginDemo02")
- public class LoginDemo02 extends HttpServlet {
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // 设置编码
- request.setCharacterEncoding("utf-8");
- // 获取参数
- String username = request.getParameter("username");
- String password = request.getParameter("password");final String URL = "jdbc:mysql://localhost:3306/db1";
- final String USER = "root";
- final String PASSWORD = "12345678";
- String SQL = "select * from userinfo where name = ? and password = ?";
- HttpSession session = request.getSession();// 获取 session 对象
- // 连接数据库, 查询
- try {
- Class.forName("com.mysql.jdbc.Driver");
- Connection connection = DriverManager.getConnection(URL,USER,PASSWORD);
- PreparedStatement preparedStatement = connection.prepareStatement(SQL);
- preparedStatement.setString(1,username);
- preparedStatement.setString(2,password);
- ResultSet resultSet = preparedStatement.executeQuery();
- String db_username=null;
- String db_password =null;
- if (resultSet.next()){
- db_username=resultSet.getString(2);
- db_password=resultSet.getString(3);
- }
- // 判断用户名和密码是否正确
- if (username.equals(db_username) && password.equals(db_password)){
- // 信息都正确
- // 页面跳转到 success.jsp;
- session.setAttribute("username",username);// 存储用户名
- response.sendRedirect(request.getContextPath()+"/success.jsp");
- }else {
- // 用户名获取密码不正确
- // 存储错误信息
- request.setAttribute("code_error","用户名或者密码错误");
- // 同一次请求, 请求转发
- request.getRequestDispatcher("/userinfo/index.jsp").forward(request,response);// 转发错误信息
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- this.doPost(request,response);
- }
- }
前台页面就是个很简单的 form 表单, 这里就不演示了.
最后谢谢各位同仁的观看, 我们共同学习, 共同进步~~~~
!
来源: http://www.bubuko.com/infodetail-2927477.html