web程序:所有程序部署在服务器端,通过浏览器远程访问。
服务器:提供服务,接收请求,响应
服务器:软件+硬件 广义
软件(程序) 狭义
放置文件(项目),供英特网中其他电脑访问
服务器->Web容器->中间件(连接用户请求与程序)
安装服务器:apache提供的一款开源的服务器Tomcat
(1)配置JAVA_HOME 环境变量
(2)Tomcat根据JAVA_HOME去查找jdk安装位置
(3)Tomcat的bin目录,双击startup.bat命令,启动Tomcat
bin放着各种命令,atartup.bat命令,shutdown.bat
conf放着配置文件,例如server.xml 修改端口
lib tomcat运行所需要的jar包
logs运行产生的日志文件
temp临时缓存文件
webapps部署web程序的目录
work工作目录
(4)访问IP+端口号/文件名
(1)在idea中创建一个基本的java项目
(2)点击 Add Frameworks Support ,创建web项目
(3)写index.xml 网页代码
web 配置文件
src java代码
(4)部署项目
1、手动部署
项目代码复制到服务器中
2、自动部署
1、Servlet(javaEE,javaWeb)
Servlet->Server + applet --> 用于java编写的服务器端程序
它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户通信采用“请求/响应”的模式。
作用:
(1) 接收客户端浏览器发送的请求
(2) 调用其他java代码处理请求
(3) 向客户端浏览器做出响应
在创建servlet之前,先导入servlet-api.jar包
复制进入lib包中,右键点击add as library
自己定义的类 继承HttpServlet
package com.ffyc.firstweb.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class DemoServlet extends HttpServlet {
/*
实例化,只被执行一次,只创建一个对象,此对象由服务器创建的
(1)默认是在客户端第一次访问该servlet时创建servlet对象
(2)0 值>0时,会在服务器启动时创建
*/
public DemoServlet() {
System.out.println("DemoServlet");
}
/*
初始化,当servlet对象创建后,服务器会自动调用init(),完成一些初始化操作args
如果没有需要初始化的操作,也可以不重写init() ,但服务器会调用父类init()
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
config.getInitParameter("name");
}
/*
为请求提供服务,每一次http请求,都会调用service
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service");
}
/*
当servlet对象销毁时,服务器会调用destroy(),让我们完成一些最终的操作(例如,保存日志)
如果没有一些最终的操作,也可以不重写destroy(),但服务器会调用父类destroy()
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
元素用于注册Servlet,它包含两个主要的子元素:
和 注册名称和完整类名
元素用于映射,为servlet配置一个供前端访问的映射地
通过url-pattern
web.xml 文件中使用 元素和
xml 属于标记语言,可以扩展,用来保存数据,保存配置文件数据
web.xml 是web程序的配置文件,保存各种配置信息,在服务器启动时,由服务器读取,
它必须放在web应用目录WEB-INF目录下。
实例化--> 构造方法:只被调用一次,只有第一次访问Servlet时或服务器启动时创建Servlet实例.
初始化–>init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作.
服务–>service方法:多次调用,每次请求都调用service方法,根据请求方式调用doget()方法或dopost()方法.
消亡–>destory:只被调用一次,在服务器关闭时调用,执行一些操作.
(1)、什么是HTTP?
超文本传输协议(HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于客户端浏览器和服务器之间交换数据的过程。
HTTP是一个基于TCP/IP通信协议传递数据
属于应用层的协议,由于其简捷,快速的方式,适用于分布式超媒体信息系统。
(2)、http请求
客户端连上服务器后,向服务端请求某个web资源,称为客户端向服务器发送了一个http请求。
请求包括:
请求行,请求头,请求体
请求行:包含http请求方式:请求资源名称,http版本(例如post test.jsp
HTTP/1.1)
请求头:包含主机地址,以及客户端的一些环境信息,以键值对方式传递
请求体:代表浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,多个用&链接,服务器接收到后再解析
(3)、两种http请求方式
Get方式:
超链接访问,默认是get方式
form提交,不指定method,默认为get方式
POST方式:
form提交,指定method=“post”
Get方式与Post方式的区别
Get方式主要是从服务器获取信息;post主要是向服务器提交信息
Get方式在通过URL提交数据,数据在URL中可以看到;Post方式,数据通过放置在请求体中提交.
Get方式提交的数据大小受限制一般1kb(不同浏览器也会不同);
而POST则没有此限制.
(4)、HttpServletRequest
HttpServletRequest 是ServletRequest的子接口
HttpServletRequest比ServletRequest多了一些针对于Http协议的方法
请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest表示请求
封装了请求的信息,可以从中获取任何请求信息
(5)、获取客户机/服务器信息
(6)、request获取请求参数
getParameter(name) — String 通过name获得值
getParameterValues — String[ ] 通过name获得多值
package com.ffyc.firstweb.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class Demo1Servlet extends HttpServlet {
/*
get/post区别:
get:从服务器端获取数据,在地址栏会显示发送的数据
不安全;传输的数据大小受限
post:从服务端发送数据
发送的数据在请求体,安全,大小不受限制
每次请求都要调用service ,由于http请求分为get,post请求
在servlet中两者处理略微不同
在父类定义了doget(),dopost() 分别处理 get post请求
在 父类的service方法中写了一个判断,get->doget post->dopost*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet"+req+resp);
//请求行
System.out.println(req.getMethod());//得到客户机请求方式 GET
System.out.println(req.getProtocol()); //HTTP/1.1
System.out.println(req.getServerName());//服务器名 localhost
System.out.println(req.getServerPort());//服务器端口 8080
System.out.println(req.getScheme());//请求协议 http
//请求头
System.out.println(req.getRemoteAddr()); //客户端ip 0:0:0:0:0:0:0:1
System.out.println(req.getRemotePort());//端口 64272
System.out.println(req.getHeader("User-Agent"));//电脑信息 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81
String name=req.getParameter("name"); // Safari/537.36
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
//接收用户请求的数据,tomcat8.0以后请求数据的解码方式支持中文
req.setCharacterEncoding("utf-8");
PrintWriter out=null;
try {
resp.setContentType("text/html;charset=utf-8");
out=resp.getWriter();
} catch (Exception e) {
e.printStackTrace();
}
}
}
(1)一个http响应代表服务器向客户端回送的数据,
包括:
响应行,响应头,响应体
响应行: http协议版本, 以及用于描述服务器对请求的处理结果
HTTP/1/1 (协议版本) 200(状态码) OK(状态码描述)
状态码:服务器和浏览器用于确定状态的固定数字号码
200:请求成功
302;请求重定向
400:语义有误,当前请求无法被服务器理解或请求参数有误
404:请求资源不存在,通常是路径写错了或 服务器资源删除了
500:服务内部错误(代码异常)
(2)HttpServletResponse
HttpServletResponse 是ServletResponse的子接口
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个代表相应的httpservletresponse对象
HttpServletResponse对象代表响应
(3)向浏览器动态生成网页内容
用getWriter() 获得一个printWriter字符输出流输出数据
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
//接收用户请求的数据,tomcat8.0以后请求数据的解码方式支持中文
req.setCharacterEncoding("utf-8");
PrintWriter out=null;
try {
resp.setContentType("text/html;charset=utf-8");
out=resp.getWriter();
} catch (Exception e) {
e.printStackTrace();
}
}
(4)ServletContext
Web容器在启动时,他会为每个Web应用程序都创建一个对应的ServletContext对象.
由于一个 Web应用中的所有Servlet共享同一个ServletContext对象,因此,Servlet对象之间可以通过ServletContext对象来实现数据交互,存储全局信息.
常用方法:
getInitParameter(“name”) 获得当前应用的初始化参数
setAttribute(“attrname”,value) 设置ServletContext 属性并赋值
getAttribute(“attrname”) 获得ServletContext 属性指定值
removeAttribute(“attrname”) 删除ServletContext 指定属性
getRealPath(filename) 获得文件的绝对路径
getContextPath获得当前应用的根目录
Servlet API 中,定义了HttpSession接口,用来封装会话对象.
HttpSession 是接口,会话对象是Web容器创建的,在Servlet中使用HttpServletRequest 中的方法获得会话对象
Public HttpSession getSession() : 获取跟当前请求相关的session,如果不存在session,就创建一个新的session对象返回
使用session实现会话机制的过程
1/当容器创建一个新的HttpSession对象后,即生成一个随机数,称为会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给客户端
2/调用request.getSession方法获得会话对象时,容器先从request中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象,返回使用
3/如果没有获取到JSESSIONID值,认为当前的请求没相关的会话对象,重复步骤1
会话对象生命周期
默认时间为30min销毁会话对象
设置会话时间
设置50min销毁会话
<session-config>
<session-timeout>50</session-timeout>
</session-config>
1.会话对象由谁创建的?
2.会话对象保存在哪里?
有若干客户端与服务器连接,服务器会为每个客户端的一次会话创建一个会话对象
概念:
过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求
在请求到达Servlet /JSP 之前,过滤器截获请求
作用:
在客户端的请求访问后端资源之前,拦截这些请求
Servlet API 中,与过滤器有关的API 共有三个接口,分别是:
Filter
FilterChain
FilterConfig
//统一编码过滤器
public class EncodFilter implements Filter {
String code;
//init 对filter对象进行初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
code= filterConfig.getInitParameter("code"); //filterConfig 可以获得filter的初始化参数
}
//doFilter 是filter进行过滤操作的方法,是最重要的方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
servletRequest.setCharacterEncoding(code);//设置编码
filterChain.doFilter(servletRequest,servletResponse);//请求向下执行
}
@Override
public void destroy() {
System.out.println("destory");
}
}
总结:
过滤器用来实现通用的功能,减少代码冗余,提供可维护性
一个过滤器可以配置给多个资源使用
一个资源也可以配置多个过滤器,按照配置顺序调用