Skip to content
/ Servlet Public

该项目是多个Servlet、JSP小demo的集合,都是一些基础

Notifications You must be signed in to change notification settings

zlsq/Servlet

Repository files navigation

Servlet 基础学习

一、WEB应用的发展

1.规律

  • 由单机程序向网络程序发展
  • 由CS程序向BS程序发展

2.CS和BS的区别

CS

  • Client Server
  • 客户端服务程序,客户端由程序员开发,用户需要安装

BS

  • Browser Server
  • 浏览器服务程序,不需要单独开发及安装

二、 Servlet介绍

1.服务器如何给浏览器返回网页?

1)返回静态网页

  • 百度百科、新闻等
  • 内容不变,任何人看都一样
  • 服务器保存的一个HTML,访问时直接返回它

2)返回动态网页

  • 微博、淘宝
  • 每个人看的内容有差别
  • 服务器保存一个组件,用它来拼一个动态网页
  • 在Java项目中,这个组件就是Servlet

组件:就是满足规范的对象

2.Servlet具备的特征

  • Servlet是存储在服务器上的
  • Servlet满足sun的规范
  • 它可以拼动态资源(网页、图片等)

可以处理HTTP协议

3.什么事Servlet

  • 是sun推出的用来在服务器端处理HTTP协议的组件

三、服务器

1.名称

  • Java服务器
  • WEB服务器
  • Java WEB服务器
  • Servlet容器

2.本质

  • 是一个软件:能够运行Java项目的软件
  • 和浏览器相对应、平级

3.举例

  • Tomcat
  • JBoss
  • WebLogic
  • WebSphere

四、如何使用tomcat

1.单独使用

1)配置JAVA_HOME

  • tomcat依赖于Java

2)下载及安装

  • 在apache官网下载
  • 直接解压缩(释放)即可,这是绿色免安装软件

3)启动tomcat

  • Linux:打开/tomcat/bin目录,输入./startup.sh
  • window:打开/tomcat/bin目录,双击startup.bat

给目录加权限:chmod +x *sh

4)访问tomcat

5)关闭tomcat

  • Linux:打开/tomcat/bin目录,输入./shutdown.sh
  • windows:打开/tomcat/bin目录,双击shutdown.bat

2.用Eclipse管理tomcat(开发时)

  • 配置失败需要重来:
  • window->preference->server->runtime
  • 选择tomcat点击remove
  • Eclipse左侧点击Servers项目将其删除

五、Servlet开发步骤

1.创建WEB项目

  • WEB项目有标准的WEB目录:
  • webapp/WEB-INF/web.xml

2.导入jar包

1)用maven搜javaee

  • 在搜索结果中选择javaee-api.jar

2)使用tomcat内置的jar包

  • 右键项目->properties->targeted runtimes->勾选tomcat->apply

3.开发Servlet

  • 继承于HttpServlet
  • 间接实现了Servlet接口(sun的规范)

4.配置Servlet

  • 在web.xml中加以配置

5.部署项目

  • 在Servers下点击tomcat
  • 右键点击Add and Remove
  • 弹出框中将项目从左侧移动到右侧
  • 启动tomcat

部署:就是拷贝

6.访问Servlet

六、代码执行过程及错误

补充

一、端口占用错误

1.出现问题的情况

  • 报错:Address already in user,JVM_BIND:8080

2.原因及解决方案

1)tomcat启动了2次,造成端口冲突

  • 打开/tomcat/bin目录,执行shutdown命令,强制关闭它

2)其他软件占用了此端口(Oracle)

  • 修改tomcat的端口
  • 打开tomcat配置文件server.xml
  • 在65行修改port="8080",建议改为8088、8089等
  • 注意:关闭tomcat时修改,然后重新启动

在Servers项目下可以找到server.xml配置文件

一、HTTP协议

1.什么是HTTP协议

  • 就是一个规范(w3c)
  • 规定了:浏览器和服务器如何通信及数据格式

2.如何通信

  • 建立连接
  • 发送请求
  • 接收响应
  • 关闭连接

3.数据格式

1)请求数据(浏览器向服务器发送的数据)

  • 请求行:请求的基本信息
  • 消息头:请求数据的描述信息
  • 实体内容:请求的业务数据

2)响应数据(服务器向浏览器发送的数据)

  • 状态行:响应的基本信息
  • 消息头:响应数据的描述信息
  • 实体内容:响应的业务数据

4.对开发的要求

1)不需要管的地方

  • 通信的过程已经由浏览器和服务器实现了
  • 请求数据的组装由浏览器实现了
  • 响应数据的组装由服务器实现了

2)需要处理的地方

  • 请求的业务数据由开发者提供
  • 响应的业务数据由开发者提供

使用request处理请求数据,使用response处理响应数据

二、注册案例

三、Servlet运行原理

四、请求方式

1.什么是请求方式

  • 浏览器向服务器发送数据的方式
  • 包括很多种方式,需要掌握的是GET和POST

2.GET和POST方式的区别

1)GET

  • 采用路径传参,参数在传递过程中可见(地址栏)
  • 隐私性差
  • 传参能力有限,只能传少量参数
  • 所有的请求默认都是GET请求

2)POST

  • 采用实体内容传参,参数在传递过程中不可见
  • 隐私性好
  • 实体内容专门用来传参,大小不受限制
  • 在form上加method="post"

3.如何选择请求方式

  • 一般查询时使用GET请求,因为查询条件一般比较少
  • 一般保存时使用POST请求,因为保存的数据一般较多

五、乱码解决方案

六、案例

1.查询员工

2.增加员工

补充

1.什么是JavaBean

  • 满足如下规范的类:
  • 有package
  • 有默认构造器
  • 实现序列化接口
  • 有get/set方法

一、重定向

1.重定向在增加员工中的应用

response.sendRedirect(String url);

2.重定向的作用及原理

在重定向的过程中,影响浏览器做出动作的关键点即响应中的状态码及Location这个消息头。302状态就像一道命令一样,使得浏览器做出新的一次请求,而请求的地址会从头信息中查找。由于这个新的请求动作是由浏览器发出的,所以浏览器的地址栏上的地址会变成Location消息头中的地址。

二、路径

1.路径是什么

2.如何获取路径

  • 项目名:req.getContextPath()
  • Servlet路径:req.getServletPath()
  • 绝对路径:req.getRequestURI()
  • 完整路径:req.getRequestURL()

3.URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)的区别

1)狭义的理解(Java项目)

  • URI(统一资源标识符)是绝对路径,而URL是完整路径
  • URL(全球资源定位器)包含了URI

2)广义的理解(Web项目) *

  • URI是资源的名字
  • URL是资源的真名
  • URI包含了URL

真名只有一个,名字可以有多个

4.Servlet访问路径的配置方案

1)精确匹配(/hello)

  • 只有这一个路径可以访问此Servlet
  • 此Servlet只能处理一个请求

2)通配符(/*)

  • 所有的路径都可以访问此Servlet
  • 此Servlet能处理所有请求

3)后缀(*.abc)

  • 所有以abc为后缀的路径都可以访问此Servlet
  • 此Serlvet能处理多个请求

4)用1个Servlet处理多个请求的方案

5)通配符和后缀的典型应用场景

三、Servlet生命周期

Servlet容器如何创建Servlet对象、如何为Servlet对象分配、准备资源、如何调用对应的方法来处理请求以及如何销毁Servlet对象的整个过程即Servlet的生命周期。

1.生命周期相关方法的调用顺序

###阶段一、实例化

<servlet>
    <servlet-name>someServlet</servlet-name>
    <servlet-class>test/SomeServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping> 
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

配置文件中的load-on-startup节点用于设置该Servlet的创建时机。 当其中的值大于等于0时,表示容器在启动时就会创建实例 小于0时或没有指定时,代表容器在该Servlet被请求时再执行创建 正数的值越小,优先级越高,应用启动时就越先被创建。

###阶段二、初始化

在初始化阶段,init()方法会被调用。这个方法在javax.servlet.Servlet接口中定义。其中,方法以一个ServletConfig类型的对象作为参数。ServletConfig对象由Servlet引擎负责创建,从中可以读取到事先在web.xml文件中通过节点配置的多个name-value名值对。ServletConfig对象还可以让Servlet接受一个ServletContext对象。 一般情况下,init方法不需要编写,因GenericServlet已经提供了init方法的实现,并且提供了getServletConfig方法来获得ServletConfig对象。 注:init方法只被执行一次。

###阶段三、就绪

Servlet被初始化以后就处于能够响应请求的就绪状态。每个对Servlet的请求由一个ServletRequest对象代表,Servlet给客户端的响应由一个ServletResponse对象代表。当客户端有一个请求时,容器就会将请求与响应对象转给Servlet,以参数的形式传给service方法。service方法由javax.servlet.Servlet定义,由具体的Servlet实现。

###阶段四、销毁

Servlet容器在销毁Servlet对象时会调用destroy方法来释放资源。通常情况下Servlet容器停止或者重新启动都会引起销毁Servlet对象的动作,但除此之外,Servlet容器也有自身管理Servlet对象的准则,整个生命周期并不需要人为进行干预。

2.config和context的联系和区别

3.ServletConfig

4.ServletContext

一、context的特殊用法

1.使用场景

  • 之前使用config和context读取的都是web.xml中配置的常量
  • 有时候我们需要存取的可能是变量
  • context支持存取变量,给多个Servlet共用

2.案例

  • 给软件做一个统计流量(访问量)的功能
  • 流量是一个变量,无论访问哪个Servlet,流量+1

二、线程安全问题

1.什么时候会出现线程安全问题

  • 多人同时修改同一份数据时有此问题
  • 局部变量存储在栈里,每个线程有自己的栈帧,没有问题
  • 成员变量存储在堆里,所有线程共享这个数据,可能有问题

多个人同时修改成员变量

2.如何解决线程安全问题

  • 加锁

三、HttpServlet介绍(了解)

  • sun这样设计是为了让开发者有更多选择的空间
  • 制定的这种规范在实际使用中发现,并不会扩展为HTTP协议之外,所以有了过度设计的缺陷,也为在编写HTTP协议的Web应用时添加了一些不必要的操作。

四、JSP

JSP(Java Server Page)是Sun公司制定的一种服务器端动态页面技术的组件规范,以“.jsp”为后缀的文件中既包含HTML静态标记用于表现页面,也包含特殊的代码,用于生成动态内容。 JSP作为简化Servlet开发的一种技术,实质上最终依然要转变为Servlet才可能运行,只不过这个转变过程由Servlet容器来完成。所以遵循JSP的编写规范才能使得JSP转变为需要的Servlet。

JSP页面中的Java代码

###JSP表达式(方便输出)

<%=3+5%>
<%=add()%>
<%=xx.getName()%>
<%=xx.getName()+“abc”%>

这种形式的Java代码在转译成Servlet时,会成为service()方法中使用out.print语句的输出。

out.print(3+5);
out.print(add());
out.print(xx.getName());
out.print(xx.getName()+“abc”));

###JSP小脚本(完成相对较长的逻辑运算)

table>
<%
List<User>  allUser = (List<User>)request.getAttribute(“users“);
for(User u : allUser){
%>
          <tr>
              <td> <%=u.getId()%>    </td>
              <td> <%=u.getName()%>  </td>
          </tr>
<%
    }
%>
</table>
public void service(…){
out.write(“<table>”);
List<User>  allUser = (List<User>)request.getAttribute(“users“);
for(User u : allUser){
out.write(“<tr> <td>”);
out.print(u.getId());
out.write(“</td><td>”);
out.print(u.getName());
out.write(“</td></tr>”);
     }
        out.write(“</table>”);
}

###JSP声明(添加属性或方法)

<%!
    public void fun(){
        //…  方法体
}
%>
public class XXX_JSP extends JSPBase{
public void fun(){
   // … 方法体
     }
          public void  service(… …){
}
}

###JSP指令 ####page指令 #####导包

<%-- 导包 --%>
<%@ page import=“java.util.*“%>
<%@ page import=“java.util.*,java.sql.*“%>

#####设置response.setContentType()方法的参数值

<%-- 设置response.setConentType方法的参数值 --%>
<%@ page contentType=“text/html;charset=utf-8“%>

#####设置容器读取该文件时的解码方法

<%-- 设置容器读取该文件时的解码方式 --%>
<%@ page pageEncoding=“UTF-8“%>

####include指令

<%@ include file=“header.html” %>

JSP运行原理

隐含(内置)对象

什么是隐含对象

  • 就是在JSP上可以直接使用的对象
  • 这些对象是在service方法一开始就声明的

有哪些隐含对象

1) request

  • HttpServletRequest

2) response

  • HttpServletResponse

3) out

  • JSPWriter
  • 等价于PrintWriter

4) config

  • ServletConfig

5) application

  • ServletContext

6) exception

  • Throwable
  • 是JSP生成的Servlet所报的错

7) session

  • HttpSession

8) page

  • Object
  • 相当于this

9) pageContext

  • PageContext
  • 管理者,引用了其他8个隐含对象

总结

  • 上述9个对象的名字是固定的
  • 它们都可以在JSP上直接使用

使用的例子

<%String user = request.getParameter("user");%>
<%=request.getParameter("user")%>

一、开发模式

1. Model 1

  • 使用一个组件(Servlet/JSP)处理请求
  • 缺点:该组件将java和HTML高度耦合在一起

2. Model 2(MVC)

  • 使用2个组件协同处理请求
  • 优点:将java和HTML代码解耦

二、转发和重定向

1.它们的相同点

  • 都是用来解决web组件之间的跳转问题
  • web组件:Servlet/JSP

2.它们的区别

3.它们的一般使用场景

  • 一般查询时从查询Servlet转发到查询JSP
  • 一般增加、修改、删除(Servlet)后重定向到查询(Servlet)

三、EL和JSTL

1.作用

2.案例

3.JSTL运行原理

About

该项目是多个Servlet、JSP小demo的集合,都是一些基础

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published