servlet、JSP简易总结

项目要求学习j2ee,先从servlet和JSP学起,这是后面框架的基础。

一、简介

学习一项新技术之前,先要搞明白这项技术是什么、为什么要学。

servlet是一种处理动态web网页的技术,本质是实现了servlet接口的类,可用于实现网页的逻辑。而JSP就是一种servlet,它是先编译成servlet再执行的文件。

为什么要学?虽然后面的框架可以替代这两个东西,但是学习servlet可以更好地理解处理动态web网页的方法,有助于后面的学习。

二、知识总结

本人小白,只学习了浅显简易的知识,在此处做简单总结。

1.servlet生命周期

一个Servlet的生命周期由实例化,初始化,提供服务,销毁,被回收几个步骤组成

实例化(进行构造方法)首先要知道,一个servlet类只实例化一次,换句话说就是只创建一个对象,当第二次访问时不再创建

初始化(进行init()方法):在构造方法执行后执行。和实例化一样,无论访问了多少次,初始化只进行一次

提供服务(进行service()方法):在service()中编写我们的业务代码,通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法

销毁(进行destroy()方法):该Servlet所在的web应用重新启动或者关闭tomcat时会调用这个方法

被回收:gc进行垃圾回收

2.两种跳转

服务器端跳转:

比如,如果登录成功跳转到success.html可用request.getRequestDispatcher("success.html").forward(request, response)语句,服务器端的跳转有如下性质

(1)浏览器路径不变

客户并不知道服务器是将本页面跳转到另一个页面进行处理的,浏览器中的路径不会变成success.html

(2)request保持一致

如果向跳转前的页面传参数,跳转后的页面也可以收到这个参数

//此处应有代码说明,在此不展示了

客户端跳转:

语句为response.sendRedirect("fail.html")。和服务器端跳转相反,有如下性质

(1)浏览器路径改变

用这种语句实质上是使客户端重定向,所以客户端可以知道这个信息,浏览器路径会变为跳转后的路径

(2)request改变

原理同(1)重定向相当于对新路径重新发起了一次http请求,所以request对象不是同一个,向第一个页面传参数后面的页面不会受到这个参数

在JSP中,服务器端跳转还可以使用<jsp:forward page="hello.jsp"/>的简化代码

3.request、response方法总结

request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)" 
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名" 
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST

获取参数:

request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。

PrintWriter pw= response.getWriter():设置响应内容

response.setContentType("text/html"):设置响应格式

4.jsp基本语法

jsp在形式上可以看成在html中写java代码,jsp由这些页面元素组成

(1) 静态内容
就是html,css,javascript等内容
(2)指令
以<%@开始 %> 结尾,比如<%@page import="java.util.*"%>
(3)表达式 <%= %>
用于输出一段html
(4) Scriptlet
在<%%> 之间,可以写任何java 代码
(5) 声明
在<%!%> 之间可以声明字段或者方法。但是不建议这么做。
(6)动作
<jsp:include page="Filename" > 在jsp页面中包含另一个页面。
(7)注释 <%-- -- %>
不同于html的注释 <!-- --> 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了

5.两种包含

jsp中有两种方式包含页面,指令include和动作include

(1)指令include

in.jsp:

< hr >
被嵌入的jsp
</ p >
 
out.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
     
外部jsp
 
<%@include file="in.jsp" %>

指令include通过指令<%@include file="include.jsp" %>来实现。用这种方法包含页面是在编译时就把页面包含进来一起编译,只会生成一个.java文件。同时,因为指令<%@include 会导致两个jsp合并成为同一个java文件,所以就不存在传参的问题,在out.jsp 里定义的变量,直接可以在in.jsp中访问

(2)动作include

将out.jsp中最后一句改为<jsp:include page="in.jsp" />就成为了动作include。这种方法包含页面是动态的包含,如果不执行这句话,in.jsp就不会被编译,因此这样包含依旧会生成两个.java文件,并且用这种方法还可以像函数一样传递参数

<jsp:include page="in.jsp">
  <jsp:param name="year" value="2017" />
</jsp:include>
就传递了year这个参数,in.jsp可以使用这个参数。
 
6.cookie、session
(1)cookie
Cookie是一种浏览器和服务器交互数据的方式。Cookie由服务器端创建, 创建好之后,发送给浏览器。浏览器保存在用户本地。 下一次访问网站的时候,就会把该Cookie发送给服务器。平时我们用的记住登录状态就是用的cookie。cookie会在客户端存一段时间,具体时间可由服务器决定。

下面是cookie的使用演示

//cookie的存储方式类似于map,是一种键值对的存储结构,键必须是String类型,值是Object类型

Cookie c = new Cookie("name", "Gareen"); //创建了一个cookie,名字是"name" 值是"Gareen"

c.setMaxAge(24 * 60 * 60); //表示这个cookie可以保留一天,如果是0,表示浏览器一关闭就销毁

c.setPath("/"); //Path表示访问服务器的所有应用都会提交这个cookie到服务端,如果其值是 /a, 那么就表示仅仅访问 /a 路径的时候才会提交 cookie

response.addCookie(c); //通过response把这个cookie保存在浏览器端

Cookie[] cookies = request.getCookies(); //表示获取所有浏览器传递过来的cookie

if (null != cookies ) //如果浏览器端没有任何cookie,得到的Cookie数组是null

//遍历所有的cookie

for (int d = 0; d <= cookies.length - 1; d++) {
out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
}
 
(2)session
session和cookie一样,是记录网页状态的数据,它存在服务器端。session的中文翻译是会话,它从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话, 直到该用户关闭浏览器为止。session的一个使用实例是电商网站中的购物车,当你选好要买的东西,放入购物车中,点击结算按钮,通过session来记录你买了什么东西。
虽然是在服务器端的数据,但对每个访问它的客户端都有一个独立的session。用上面的购物车例子解释:比如A客户买了两件东西,而B客户买了三件东西,这两个客户必须使用不同的session才能准确的记录所购买的东西。要实现这样的效果,需要在每次新建一个session时记录下浏览器的编号,使一个浏览器对应一个session,每次使用session时,浏览器传给服务器自己的sessionID,就可以找到正确的数据。
 
 
session有两种实现方式,一是由cookie实现,二是重写URL实现
cookie实现:既然每次访问需要sessionID,可以把浏览器的ID放在临时cookie中,大多数session都由此实现,代码示例如下
 
request.getSession(true) //参数为true表示如果没有session则创建,有则返回session;参数为false若没有则不创建
session.setAttribute("username", "liutao");  //和cookie一样的储存结构
 

//获取Session
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
System.out.println("username:"+username);

重写URL:若浏览器不支持cookie,则需要在页面中的每个链接都用response.encodeURL()方法重写URL,这种方法比较麻烦,甚至有些公司干脆没有这个步骤,必须需要用户打开cookie才能正常使用。

7.jsp中用javabean

javabean广义上指所有的java类,狭义上指满足sun定义的具有某种特性的类:

  • 提供一个默认的无参构造函数。
  • 需要被序列化并且实现了Serializable接口。
  • 可能有一系列可读写属性。
  • 可能有一系列的"getter"或"setter"方法。

jsp中使用的是狭义的javabean,具体语法见下面的代码示例

public class StudentsBean implements java.io.Serializable
{
   private String firstName = null;
   private String lastName = null;
   private int age = 0;

   public StudentsBean() {
   }
   public String getFirstName(){
      return firstName;
   }
   public String getLastName(){
      return lastName;
   }
   public int getAge(){
      return age;
   }

   public void setFirstName(String firstName){
      this.firstName = firstName;
   }
   public void setLastName(String lastName){
      this.lastName = lastName;
   }
   public void setAge(int age) {
      this.age = age;
   }
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>get 和 set 属性实例</title>
</head>
<body>

<jsp:useBean id="students" 
                    class="StudentsBean"> 
   <jsp:setProperty name="students" property="firstName"
                    value="小强"/>
   <jsp:setProperty name="students" property="lastName" 
                    value="王"/>
   <jsp:setProperty name="students" property="age"
                    value="10"/>
</jsp:useBean>

<p>学生名字: 
   <jsp:getProperty name="students" property="firstName"/>
</p>
<p>学生姓氏: 
   <jsp:getProperty name="students" property="lastName"/>
</p>
<p>学生年龄: 
   <jsp:getProperty name="students" property="age"/>
</p>

</body>
</html>

本文章很浅层的总结了一些servlet和jsp知识,深度学习还需参考其他资料

参考链接:http://how2j.cn/

猜你喜欢

转载自www.cnblogs.com/amazingyp/p/10603915.html