jsp学习总结
http简介
-
简介:http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
-
工作原理:
-
客户端使用HTTP协议通过URL向服务端发送请求信息
-
服务端使用HTTP协议向请求的客户端发送响应信息
-
-
工作特性:
-
无连接:每个请求都会建立一次http连接(根本上是tcp连接)
-
媒体独立:对传输的数据不作要求,由客户端和服务端自行处理
-
无状态:不会对数据的传输历史进行记忆,若需要先前就传过的数据需要重传
-
-
客户端请求信息:
-
请求消息的格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分
-
chrome中查看请求消息
-
-
服务端响应消息:
-
响应消息的格式:状态行、消息报头、空行和响应正文四个部分
-
chrome中查看响应消息
-
-
状态码:
-
简介:是用以表示网页服务器超文本传输协议响应状态的3位数字代码。简而言之,就是代表响应的状况
-
常见状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
-
jsp简介
-
简介:JSP全称Java Server Pages,是一种动态网页开发技术。是一种在html文档中嵌入Java代码的动态网页
-
jsp作用:可以在服务器端对客户的请求,动态响应给客户端一个html网页(比如不同的用户登录,会得到不同的含用户信息的网页)
-
web服务器中,jsp的处理过程:
-
服务器收到一个对jsp网页的请求
-
载入对应的jsp文件
-
解析jsp文件,并转换为一个Servlet类
-
编译Servlet类,使其变为一个可执行类(.class字节码)
-
将请求传给Servlet,并运行该类将Java代码转换为静态的html代码
-
服务器将最终得到的html网页响应给客户端
-
-
jsp的生命周期:
-
编译:
将jsp解析成Servlet类,并将该类编译成字节码文件 -
初始化
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法public void jspInit(){ // 初始化代码 }
-
执行
调用创建的实例的服务方法(该方法需要一个请求对象和响应对象参数)void _jspService(HttpServletRequest request,HttpServletResponse response) { // 服务端处理代码 }
- HttpServletRequest request:请求对象(后面介绍)
- HttpServletResponse response:响应对象(后面介绍)
-
销毁
调用实例的销毁方法,销毁实例public void jspDestroy() { // 清理代码 }
从本质上讲,jsp是一个Servlet类。
-
jsp基础语法
-
代码片段语句(java代码片段)
<% 代码片段 %>
注:
-
所有的代码片段在编译成Servlet时,都会被封装到void _jspService(HttpServletRequest request,HttpServletResponse response){}方法中
-
由于被封装到同一个方法,该片段可多次出现,且与上一个代码段形成对应(比如将if语句分在两个代码片段中实现,中间包含一些html代码,如下)
<% if (day == 1 | day == 7) { %> <p> Today is weekend</p> <% } else { %> <p> Today is not weekend</p> <% } %>
-
-
变量声明
<%! declaration; declaration; ... %>
注:该方式声明的变量会被当作成员变量使用
-
jsp表达式(获取某个表达式的值,并输出到网页中)
<%= 表达式 %>
-
jsp注释:
<%-- 这里可以填写 JSP 注释 --%>
注:java的注释格式和html的注释格式在jsp中也可以用,但必须在对应的位置使用(比如Java注释在Java语句中使用,html的注释在html语句中使用)
-
jsp指令:
-
指令标签及其常见属性:
-
<%@ page … %>:定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
-
contentType:指定当前JSP页面的MIME类型和字符编码
-
errorPage:指定当JSP页面发生异常时需要转向的错误处理页面
-
import:导入要使用的Java类
-
language:定义JSP页面所用的脚本语言,默认是Java
-
session:指定JSP页面是否使用session
-
buffer:指定out对象(后面说明)使用缓冲区的大小
-
-
<%@ include … %>:包含其他文件,被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
-
<%@ taglib … %>:引入标签库的定义,可以是自定义标签
-
-
指令的使用:
-
格式:
<%@ 指令 属性="value" %>
注:多个属性间用空格隔开
-
例子:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
-
language=“java”:指定脚本语言为java,默认也为java
-
contentType=“text/html; charset=utf-8”:指定文档的类型为text/html,编码格式为utf-8
-
pageEncoding=“utf-8”:页面编码为utf-8
-
-
-
jsp的九大隐式对象
-
简介:
-
request:HttpServletRequest类的实例。封装了客户端向服务端的请求参数和客户端信息
-
response:HttpServletResponse类的实例。封装了服务端向客户端的响应内容
-
out:PrintWriter类的实例,用于把结果输出至网页上
-
session:HttpSession类的实例。用于记录客户端连接到服务端的一次会话,随着客户端访问网站而生成、关闭所有访问而消失
-
application:ServletContext类的实例,与应用上下文有关。在JSP页面的整个生命周期中都代表着这个JSP页面。其可见范围为web项目中的所有jsp页面
-
config:ServletConfig类的实例(具体参考Servlet中的使用,在jsp中不常用)
-
pageContext:PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
-
page:类似于Java类中的this关键字,是整个JSP页面的代表。
-
Exception:Exception类的对象,代表发生错误的JSP页面中对应的异常对象。一般的jsp文件中不使用,能使用该对象的jsp文件必须使用了"<%@ page isErrorPage=true %>"语句
-
-
常用对象:
-
request:用于获取请求参数
-
response:用于设置响应内容的一些信息(比如状态码)
-
session:用于维护整个会话中的信息的传递(比如登录后用户的信息,希望在登录后都能访问到)
-
application:用于维护整个web服务的公共信息
-
-
对象的常用方法
-
Enumeration getAttributeNames():返回对象的所有属性名称的集合
-
Enumeration getParameterNames():返回请求中所有参数的集合
-
Object getAttribute(String name):返回名称为name的属性值,如果不存在则返回null
-
String getParameter(String name):返回此request中name指定的参数,若不存在则返回null
-
String getMethod():返回此request中的HTTP方法,比如 GET,,POST,或PUT
-
void setAttribute(String name, Object o):向对象中设置属性
-
RequestDispatcher getRequestDispatcher(String path):将请求转发给其他页面处理,一般用法如下
request.getRequestDispatcher("login.jsp").forward(request, response);
- “login.jsp”:是目标页面的文件路径
- forward(request, response):指将request, response对象也传过去
-
登录、注册小案例
-
项目结构:
-
代码逻辑:
-
首页展示登录和注册链接,点击跳转到登录和注册页面
-
注册界面注册常规的信息,注册信息提交到注册处理界面处理(判断用户是否被注册、添加用户信息);若用户被注册则跳转到注册页面重新注册,注册成功跳转到登录页面
-
登录界面进行用户名和密码登录,登录信息提交到登录处理界面,若验证通过则跳转到个人首页,否则重新登录
-
-
详细内容:
User.java(用户信息类)
package cn.zero.model; /* * 用户模型类 */ public class User { private String username; private String password; private String gender; private int age; public User() { super(); } public User(String username, String password, String gender, int age) { super(); this.username = username; this.password = password; this.gender = gender; this.age = age; } 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; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", gender=" + gender + ", age=" + age + "]"; } }
DBUtils.java(模拟处理数据库业务的工具类)
package cn.zero.util; import java.util.HashMap; import java.util.Map; import cn.zero.model.User; /* * 数据库工具类 */ public class DBUtils { //模拟数据库,用于存放数据 public static Map<String, User> db = new HashMap<String, User>(); //用于添加一个用户到map中 public static boolean add(User user) { if(db.containsKey(user.getUsername())) return false; db.put(user.getUsername(), user); return true; } //用于校验用户信息 public static boolean verify(String username, String password) { if(db.containsKey(username)){ if(db.get(username).getPassword().equals(password)) { return true; } } return false; } }
index.jsp(首页)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>首页</title> </head> <body> <a href="login.jsp">登录</a> <a href="register.jsp">注册</a> </body> </html>
login.jsp(登录界面)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>登录</title> </head> <body> <% Object msg = request.getAttribute("msg"); if(msg != null){ %> <%=(String)msg %> <% } %> <form action="login_do.jsp" method="post"> 用户名:<input type="text" name="username" placeholder="请输入用户名" /> <br/> 密码:<input type="password" name="password" placeholder="请输入密码" /> <br/> <input type="submit" value="提交" /> </form> </body> </html>
register.jsp(注册界面)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>注册</title> </head> <body> <% //获取request中置入的属性 Object msg = request.getAttribute("msg"); if(msg != null){ %> <%=(String)msg %> <% } %> <form action="register_do.jsp" method="post"> 用户名:<input type="text" name="username" placeholder="请输入用户名" /> <br/> 密码:<input type="password" name="password" placeholder="请输入密码" /> <br/> 性别: <input type="radio" name="gender" value="man">男 <input type="radio" name="gender" value="woman">女 <br/> 年龄:<input type="text" name="age" placeholder="请输入年龄" /> <br/> <input type="submit" value="提交" /> </form> </body> </html>
login_do.jsp(登录处理界面)
<%@page import="cn.zero.util.DBUtils"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <% //获取登录的用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); //验证用户信息是否正确 boolean flag = DBUtils.verify(username, password); if(flag){ //验证通过则将登录的个人信息放入session对象中跳到个人中心 session.setAttribute("user", DBUtils.db.get(username)); request.getRequestDispatcher("me.jsp").forward(request, response); }else{ //验证失败则重新登录 request.setAttribute("msg", "用户名或密码错误,请重新登录"); request.getRequestDispatcher("login.jsp").forward(request, response); } %> </body> </html>
register_do.jsp(注册处理界面)
<%@page import="cn.zero.util.DBUtils"%> <%@page import="cn.zero.model.User"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <% //获取请求参数信息 String username = request.getParameter("username"); String password = request.getParameter("password"); String gender = request.getParameter("gender"); int age = Integer.parseInt(request.getParameter("age")); //将请求参数封装到模型中 User user = new User(); user.setUsername(username); user.setPassword(password); user.setGender(gender); user.setAge(age); //将数据存入模拟的数据库中 boolean flag = DBUtils.add(user); //注册成功转发到登录页,否则跳转到注册页面 if(flag){ request.setAttribute("msg", "注册成功,请登录"); request.getRequestDispatcher("login.jsp").forward(request, response); }else{ request.setAttribute("msg", "用户名已被使用,请输入其他用户名"); request.getRequestDispatcher("register.jsp").forward(request, response); } %> </body> </html>
me.jsp(简单的个人首页)
<%@page import="cn.zero.model.User"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <% //获取session中置入的用户信息 Object o = session.getAttribute("user"); User user = null; if(o!=null){ user = (User)o; } %> 用户名:<%= user.getUsername() %> <br/> 性别:<%= user.getUsername() %> <br/> 年龄:<%= user.getUsername() %> </body> </html>