- 由单机程序向网络程序发展
- 由CS程序向BS程序发展
- Client Server
- 客户端服务程序,客户端由程序员开发,用户需要安装
- Browser Server
- 浏览器服务程序,不需要单独开发及安装
- 百度百科、新闻等
- 内容不变,任何人看都一样
- 服务器保存的一个HTML,访问时直接返回它
- 微博、淘宝
- 每个人看的内容有差别
- 服务器保存一个组件,用它来拼一个动态网页
- 在Java项目中,这个组件就是Servlet
组件:就是满足规范的对象
- Servlet是存储在服务器上的
- Servlet满足sun的规范
- 它可以拼动态资源(网页、图片等)
可以处理HTTP协议
- 是sun推出的用来在服务器端处理HTTP协议的组件
- Java服务器
- WEB服务器
- Java WEB服务器
- Servlet容器
- 是一个软件:能够运行Java项目的软件
- 和浏览器相对应、平级
- Tomcat
- JBoss
- WebLogic
- WebSphere
- tomcat依赖于Java
- 在apache官网下载
- 直接解压缩(释放)即可,这是绿色免安装软件
- Linux:打开/tomcat/bin目录,输入./startup.sh
- window:打开/tomcat/bin目录,双击startup.bat
给目录加权限:chmod +x *sh
- 打开浏览器,输入http://localhost:8080
- Linux:打开/tomcat/bin目录,输入./shutdown.sh
- windows:打开/tomcat/bin目录,双击shutdown.bat
- 配置失败需要重来:
- window->preference->server->runtime
- 选择tomcat点击remove
- Eclipse左侧点击Servers项目将其删除
- WEB项目有标准的WEB目录:
- webapp/WEB-INF/web.xml
- 在搜索结果中选择javaee-api.jar
- 右键项目->properties->targeted runtimes->勾选tomcat->apply
- 继承于HttpServlet
- 间接实现了Servlet接口(sun的规范)
- 在web.xml中加以配置
- 在Servers下点击tomcat
- 右键点击Add and Remove
- 弹出框中将项目从左侧移动到右侧
- 启动tomcat
部署:就是拷贝
- 报错:Address already in user,JVM_BIND:8080
- 打开/tomcat/bin目录,执行shutdown命令,强制关闭它
- 修改tomcat的端口
- 打开tomcat配置文件server.xml
- 在65行修改port="8080",建议改为8088、8089等
- 注意:关闭tomcat时修改,然后重新启动
在Servers项目下可以找到server.xml配置文件
- 就是一个规范(w3c)
- 规定了:浏览器和服务器如何通信及数据格式
- 建立连接
- 发送请求
- 接收响应
- 关闭连接
- 请求行:请求的基本信息
- 消息头:请求数据的描述信息
- 实体内容:请求的业务数据
- 状态行:响应的基本信息
- 消息头:响应数据的描述信息
- 实体内容:响应的业务数据
- 通信的过程已经由浏览器和服务器实现了
- 请求数据的组装由浏览器实现了
- 响应数据的组装由服务器实现了
- 请求的业务数据由开发者提供
- 响应的业务数据由开发者提供
使用request处理请求数据,使用response处理响应数据
- 浏览器向服务器发送数据的方式
- 包括很多种方式,需要掌握的是GET和POST
- 采用路径传参,参数在传递过程中可见(地址栏)
- 隐私性差
- 传参能力有限,只能传少量参数
- 所有的请求默认都是GET请求
- 采用实体内容传参,参数在传递过程中不可见
- 隐私性好
- 实体内容专门用来传参,大小不受限制
- 在form上加method="post"
- 一般查询时使用GET请求,因为查询条件一般比较少
- 一般保存时使用POST请求,因为保存的数据一般较多
- 满足如下规范的类:
- 有package
- 有默认构造器
- 实现序列化接口
- 有get/set方法
response.sendRedirect(String url);
在重定向的过程中,影响浏览器做出动作的关键点即响应中的状态码及Location这个消息头。302状态就像一道命令一样,使得浏览器做出新的一次请求,而请求的地址会从头信息中查找。由于这个新的请求动作是由浏览器发出的,所以浏览器的地址栏上的地址会变成Location消息头中的地址。
- 项目名:req.getContextPath()
- Servlet路径:req.getServletPath()
- 绝对路径:req.getRequestURI()
- 完整路径:req.getRequestURL()
- URI(统一资源标识符)是绝对路径,而URL是完整路径
- URL(全球资源定位器)包含了URI
- URI是资源的名字
- URL是资源的真名
- URI包含了URL
真名只有一个,名字可以有多个
- 只有这一个路径可以访问此Servlet
- 此Servlet只能处理一个请求
- 所有的路径都可以访问此Servlet
- 此Servlet能处理所有请求
- 所有以abc为后缀的路径都可以访问此Servlet
- 此Serlvet能处理多个请求
Servlet容器如何创建Servlet对象、如何为Servlet对象分配、准备资源、如何调用对应的方法来处理请求以及如何销毁Servlet对象的整个过程即Servlet的生命周期。
<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对象的准则,整个生命周期并不需要人为进行干预。
- 之前使用config和context读取的都是web.xml中配置的常量
- 有时候我们需要存取的可能是变量
- context支持存取变量,给多个Servlet共用
- 多人同时修改同一份数据时有此问题
- 局部变量存储在栈里,每个线程有自己的栈帧,没有问题
- 成员变量存储在堆里,所有线程共享这个数据,可能有问题
多个人同时修改成员变量
JSP(Java Server Page)是Sun公司制定的一种服务器端动态页面技术的组件规范,以“.jsp”为后缀的文件中既包含HTML静态标记用于表现页面,也包含特殊的代码,用于生成动态内容。 JSP作为简化Servlet开发的一种技术,实质上最终依然要转变为Servlet才可能运行,只不过这个转变过程由Servlet容器来完成。所以遵循JSP的编写规范才能使得JSP转变为需要的Servlet。
###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” %>
- HttpServletRequest
- HttpServletResponse
- JSPWriter
- 等价于PrintWriter
- ServletConfig
- ServletContext
- Throwable
- 是JSP生成的Servlet所报的错
- HttpSession
- Object
- 相当于this
- PageContext
- 管理者,引用了其他8个隐含对象
- 上述9个对象的名字是固定的
- 它们都可以在JSP上直接使用
<%String user = request.getParameter("user");%>
<%=request.getParameter("user")%>
- 都是用来解决web组件之间的跳转问题
- web组件:Servlet/JSP
- 一般查询时从查询Servlet转发到查询JSP
- 一般增加、修改、删除(Servlet)后重定向到查询(Servlet)