Servlet
1.什么是javaweb程序?
运行在服务器上java程序就是javaweb程序,通过浏览器访问,例如我常说的网站就是典型的web程序。Web程序属于B/S架构的程序。
2.B/S架构的程序?B/S架构的程序与C/S架构的程序比较?
B–浏览器 S–服务器 【通过浏览器访问服务器上的程序】【在线的】
与B/S架构相对的就是C/S架构的程序
C-客户端 S–服务器 【通过客户端访问服务器上的程序】【下载的/安装的】
B/S架构的程序 | C/S架构的程序 |
---|---|
通过浏览器访问【在线的】 | 通过客户端访问【下载的/安装的】 |
节省本地磁盘资源【不需要下载】 | 消耗本地磁盘资源【将资源下载到本地】 |
维护起来简单【只需要维护好服务器】 | 维护起来复杂【既要维护客户端又要维护服务器】 |
成本低 | 成本高 |
现在所有的C/S架构的程序基本上已经被B/S架构的程序取代。
3.Web程序发展过程?
早期Web程序只能通过浏览器访问静态页面【HTML】
随着需求的变化,后来Web程序可以通过浏览器访问动态资源【动态网页】。
静态页面—任何请求访问的页面都是一模一样的,不后有任何变化【标配】
动态网页—随着请求的变化打开不同的页面【不同的用户/不同是时间】【定制】
现在随着用户需求得到变化,我们需要提供不同的资源,以满足所有的用户需求,那么这时我们就要掌握动态网页技术。
4.常见的动态网页技术?
cgi[通用网关接口]【1、运行慢 2.基于进程的数据交互麻烦】
Servlet/jsp-----java
asp--------------C#
php-------------php语法
5.什么是Servlet?
运行在服务器上用来处理用户的请求,做出响应的java程序就是Servlet。
6.常见的web服务器
WEB服务器也称为WWW服务器、HTTP服务器,其主要功能是提供网上信息浏览服务。Unix和Linux平台下常用的服务器有ApacheTomcat、Nginx[负载均衡【分布式】]、IBM WebSphere、WebLogic等,其中应用最广泛的是ApacheTomcat。
7.ApacheTomcat服务器下载?安装?启动?测试?关闭?
下载ApacheTomcat服务器
http://tomcat.apache.org/
安装ApacheTomcat服务器【apache-tomcat-7.0.96-windows-x64.zip】,在指定目录下解压缩。
启动运行ApacheTomcat服务器,在安装目录中打开bin目录,运行startup.bat批处理文件,即可运行ApacheTomcat服务器
测试ApacheTomcat服务器,打开浏览器输入http://127.0.0.1:8080
关闭ApacheTomcat服务器,在安装目录中打开bin目录,运行shutdown.bat批处理文件,即可关闭ApacheTomcat服务器
8.开发一个简单的Servlet程序部署到服务器上运行
创建一个Dynamic Web Project工程
选择具体的服务器安装目录和jre
在src下创建一个包,在这个包中创建一个“TestServlet”类,继承HttpServlet
重写doGet/doPost方法
在doGet方法中调用doPost
将需要由servlet处理的请求的具体动作写入doPost方法中
打开WebContent/WEB-INF/web.xml,配置我们编写好的servlet
部署Servlet程序到服务器
运行程序【选择自己配置部署好的服务器–右键—start】
访问【http://127.0.0.1:8080/xxxxxxxx】
9.Servlet的生命周期?
Servlet的生命周期是从开始创建servlet对象一直到处理客户端请求以后,的整个过程就是Servlet的生命周期
servlet在运行的时候是由Servlet容器【服务器】来管理和维护Servlet的运行。不是程序开发者自己去实例化Servlet对象,然后调用方法执行,处理用户请求的。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>TestServletDemo1</display-name>
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.click369.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet{
/**
* servlet的初始化方法init
* 可以在这个方法中得到数据库对象等等这些操作
* 就是在这个地方去完成一些在处理用户请求之前需要的一些准备工作
* 在请求第一次执行的时候,只被执行了一次。
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet的初始化方法init方法");
}
/**
* Servlet的service方法处理用户的请求并作出响应
* HttpServletRequest---请求对象
* HttpServletResponse---响应对象
* 会被多次执行
*/
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("处理用户请求作出响应的service方法");
}
/**
* servlet对象的销毁方法
* 完成一些在处理用户请求之后需要的一些收尾工作
* 例如:关闭数据库/输出输出流
*/
@Override
public void destroy() {
System.out.println("销毁实例化好的Servlet对象,释放Servlet所占用的内存空间");
}
}
10.Servlet中常用的接口,类,方法
Servlet接口javax.servlet.Servlet
javax.servlet.Servlet接口
init(ServletConfig)–初始化方法
ServletConfig getServletConfig()–得到Servlet配置对象【web.xml对应的java对象】
void service(javax.servlet.ServletRequest arg0, javax.servlet.ServletResponse arg1)–请求处理
String getServletInfo()–servlet信息【不常用】
void destroy()—销毁servlet对象
例如:
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet implements Servlet{
/**
* servlet的初始化方法
* @param arg0
* @throws ServletException
*/
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("servlet的初始化方法");
}
/**
* servlet的请求处理方法
* @param arg0
* @param arg1
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("servlet的请求处理方法");
}
/**
*servlet的销毁方法
*/
@Override
public void destroy() {
System.out.println("servlet的销毁方法");
}
/**
* 得到servlet的配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 得到servlet基本信息
* @return
*/
@Override
public String getServletInfo() {
return null;
}
}
ServletConfig接口javax.servlet.ServletConfig----Servlet配置对象【web.xml对应的java对象】
Strign getServletName()–得到web.xml中配置servlet-name
例如:
ServletConfig conf=this.getServletConfig();
String servletname=conf.getServletName();
String getInitParameter(String)—得到在web.xml文件中配置的初始化参数值
例如:
需要在web.xml文件中配置一个/多个初始化参数
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.click369.servlet.TestServlet</servlet-class>
<init-param>
<param-name>myname</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>myaddress</param-name>
<param-value>西安</param-value>
</init-param>
</servlet>
通过String getInitParameter(String)---得到在web.xml文件中配置的初始化参数值
//得到ServletConfig对象
ServletConfig conf=this.getServletConfig();
String name=conf.getInitParameter("myname");
String address=conf.getInitParameter("myaddress");
System.out.println(name+" "+address);
ServletContext getServletContext()—得到servlet上下文对象【运行环境】
可以获取当前服务器所支持的Servlet版本号
例如:
ServletConfig conf=this.getServletConfig();
ServletContext context=conf.getServletContext();
int majorVersion=context.getMajorVersion();//主版本号
int MinorVersion=context.getMinorVersion();//次版本号
System.out.println(majorVersion+"."+MinorVersion);
HttpServletRequest接口javax.servlet.http.HttpServletRequest【表示一个http请求对象】
HttpServletRequest继承了javax.servlet.ServletRequest
void setCharacterEncoding(String)–设置请求对象的字符编码
String getCharacterEncoding()----得到请求对象的字符编码
String getParameter(String)–得到指定请求参数的值
HttpServletResponse接口 javax.servlet.http.HttpServletResponse【表示一个http响应对象】
HttpServletResponse接口继承了 javax.servlet.ServletResponse
sendRedirect(String)----设置跳转
setCharacterEncoding(String)—设置响应对象的字符编码
11.forward与Redirect【resp.sendRedirect(String)】跳转的区别?
11.1 forward是指通过RequestDispatcher对象调用forward方法完成跳转
通过HttpServletRequest对象调getRequestDispatcher方法就可以得到RequestDispatcher对象
所谓的forward跳转实际上是请求的一次转发,所以forward有时被认为是请求转发,最显著的特征是浏览器地址栏中的地址不会发生变化,因为跳转的时候使用的是同一个请求对象。
跳转的时候可以去掉跳转路径前面的“/”
req.getRequestDispatcher("/tow").forward(req,resp);
req.getRequestDispatcher(“tow”).forward(req, resp);
11.2 Redirect指的是通过HttpServletResponse对象调用sendRedirect(String)方法完成跳转
HttpServletResponse对象.sendRedirect(String)
所谓的Redirect跳转实际上是请求的一次重定向,所以Redirect有时被认为是请求重定向,最显著的特征是浏览器地址栏中的地址会发生变化,因为跳转的时候使用的是不在是同一个请求对象。
跳转的时候必须去掉跳转路径前面的“/”
//resp.sendRedirect("/tow"); //错误的
resp.sendRedirect("tow");
12.为什么需要会话跟踪?什么是会话跟踪?四种会话跟踪技术?
使用浏览器发送的http请求,使用的是http协议完成请求发送,而http协议是一种无状态的协议,它不会去主动记录使用这个http协议的用户是谁,一旦请求发送成功,服务器做出响应以后,那么此时浏览器与服务器之间的链接就会消失,这时服务器就不知道请求来自哪里,是谁发送来的。所以这时我们就需要记录/保存请求/链接的状态,实现这个记录记录/保存请求/链接的状态的过程就叫会话跟踪。
URL重写:URL地址重写的原理是将该用户Session的id信息重写到URL地址中,以便在服务器端进行识别不同的用户。URL重写能够在客户端停用cookies或者不支持cookies的时候仍然能够发挥作用。
https://blog.csdn.net/qq_33098039/article/details/78184535?sessionid=123456
将会标识用户的一个编号,跟随在每一个http请求中,用于让服务器认识这个用户。
隐藏表单域:将用户Session的id信息添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示,浏览时看不到,源代码中有。
Cookie:Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。服务器创建保存于浏览器端,不可跨域名性,大小及数量有限。客户端可以采用两种方式来保存这个Cookie对象,一种方式是 保存在 客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。 这样就实现了对客户的跟踪。Cookie是可以被禁止的。
session:每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。保存在服务器端。需要解决多台服务器间共享问题。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。
13.Session和Cookie区别?
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
应用场景:
记住账号密码一般在cookie中,购物车的实现一般也是cookie。
私人信息及登陆验证信息在session中。
14.HttpSession的常用方法?
在上面的这个例子中我们通过Redirect从OneServlet跳转到TowServlet的时候无法在TowServlet中得到在OneServlet的这个请求对象中保存的数据。我们如果采用Redirect跳转,那么该如何在两个Servlet中传递数据???
我们可以使用HttpSession接口对象在两个Servlet中传递数据。
HttpSession接口—表示一个会话对象【同一个用户所发出的一系列请求】
通过HttpServletRequest对象调用getSession(),就可以得到HttpSession接口对象。
HttpSession接口对象.setAttribute(arg0, arg1)—将数据保存到HttpSession对象
HttpSession接口对象.getAttribute(String)–从HttpSession对象获取指定的数据
HttpSession接口对象.removeAttribute(arg0);–从HttpSession对象移除指定的数据
例如:
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class OneServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet---doPost");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session=req.getSession();
session.setAttribute("myname", "张三疯");
//req.getSession().setAttribute("myname", "张三疯");
resp.sendRedirect("tow");
}
}
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class TowServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("TowServlet---doPost");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session=req.getSession();
String value=(String)session.getAttribute("myname");
System.out.println("TowServlet==msg=="+value);
}
}
15.Get与Post的区别?
1、url可见性:
get,参数url可见;
post,url参数不可见
2、数据传输上:
get,通过拼接url进行传递参数;
post,通过body体传输参数
3、缓存性:
get请求是可以缓存的
post请求不可以缓存
4、后退页面的反应
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交请求
5、传输数据的大小
get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
6、安全性
这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。