Servlet

一、什么是Servlet Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。 Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。 Servlet的三个特点 Servlet就是JAVA类 Servlet是一个继承HttpServlet类的类 在服务器端运行,用以处理客户端的请求 二、Servlet相关包的介绍 javax.servlet.* :存放与HTTP 协议无关的一般性Servlet 类; javax.servlet.http.*:除了继承javax.servlet.*之外,并且还增加与HTTP协议有关的功能。(注意:大家有必要学习一下HTTP协议,因为WEB开发都会涉及到) 所有的Servlet 都必须实现javax.servlet.Servlet 接口(Interface)。 若Servlet程序和HTTP协议无关,那么必须继承javax.servlet.GenericServlet类; 若Servlet程序和HTTP协议有关,那么必须继承javax.servlet.http.HttpServlet 类。 HttpServlet :提供了一个抽象类用来创建Http Servlet。 public void doGet()方法:用来处理客户端发出的 GET 请求 public void doPost()方法:用来处理 POST请求 还有几个方法大家自己去查阅API帮助文件 javax.servlet包的接口: ServletConfig接口:在初始化的过程中由Servlet容器使用 ServletContext接口:定义Servlet用于获取来自其容器的信息的方法 ServletRequest接口:向服务器请求信息 ServletResponse接口:响应客户端请求 Filter接口: javax.servlet包的类: ServletInputStream类:用于从客户端读取二进制数据 ServletOutputStream类:用于将二进制数据发送到客户端 javax.servlet.http包的接口: HttpServletRequest接口:提供Http请求信息 HttpServletResponse接口:提供Http响应 三、Servlet生命周期 Servlet生命周期就是指创建Servlet实例后,存在的时间以及何时销毁的整个过程. Servlet生命周期有三个方法 init()方法: service()方法:Dispatches client requests to the protected service method destroy()方法:Called by the servlet container to indicate to a servlet that the servlet is being taken out of service....

June 2, 2018 · 1 min · sunbufu

Servlet分析Request和Response

分析Request import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Interface * servlet容器(服务器)创建了这个对象,和服务器耦合性高 * 为了让解析请求信息更加的方便 * 行 * 头 * 网 * 体 */ public class HiServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求行信息 getRequestLine(request); //获取请求头信息 getRequestHeader(request); //获取网络信息信息 getRequestNet(request); //获取请求体信息 getRequestBody(request); } /** * 获取请求行信息 * @param request */ private void getRequestLine(HttpServletRequest request) { System....

June 2, 2018 · 2 min · sunbufu

数据库工具类

DataBaseUtil.properties ##choose which database datatype=mysql ##oracle oracleDriver=oracle.jdbc.driver.OracleDriver oracleUrl=jdbc:oracle:thin:@127.0.0.1:1521:xe oracleUser=scott oraclePassword=tiger ##mysql mysqlDriver=com.mysql.jdbc.Driver mysqlUrl=jdbc:mysql://127.0.0.1:3306/bjsxt20151014 mysqlUser=root mysqlPassword=123456 DBUtils.java import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class DBUtils { //获取数据库配置信息 private static Properties properties = new Properties(); //定义JDBC需要的参数 private static String datatype = null; private static String driver = null; private static String url = null; private static String user = null; private static String password = null; static { //可以保证只加载一次,而且调用的时候肯定已经加载完成 try { //加载配置文件 properties....

June 2, 2018 · 3 min · sunbufu

正则表达式

引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 ‘a’ 和 任意个 ‘b’ ”,那么 ‘ab’, ‘abb’, ‘abbbbbbbbbb’ 都符合这个特征。 正则表达式可以用来: 验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。 用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。 用来替换,比普通的替换更强大。 正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。 一、 正则表达式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 1.2 简单的转义字符 一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。 表达式 可匹配 \r,\n 代表回车和换行符 \t 制表符 \\ 代表\本身 还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。 表达式 可匹配 \^ 匹配^符号本身 \$ 匹配$符号本身 \....

June 2, 2018 · 3 min · sunbufu

重定向与请求转发

一、请求转发与重定向 1. 重定向 客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。 浏览器->服务器:http请求 服务器->浏览器:接受请求并发送302状态码和新的url 浏览器->服务器:自动请求新的url 服务器->浏览器:寻找客户所需的资源响应到浏览器 2. 请求转发 客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。 浏览器->服务器:http请求 Note right of 服务器:服务器调用内部的一个方法在容器内完成请求处理和转发动作 服务器->浏览器:将客户所需资源发送到浏览器 二、请求转发与重定向在Java中的使用 servlet可以将发送给自己的某个请求转发给另外一个URL地址,这个地址可以是html、jsp、servlet或是其他的http地址。servlet的请求转发有三种方式: inclue(请求转发)方法,应用代码为 request.getRequestDispatcher("/url").include(request, response); 其中URL地址是某个http地址。include转发时,地址栏没有改变,是原来的地址,这个过程是在服务器端完成,Servlet和被包含的页面同时被输出。include() 方法执行玩后,下面的代码继续执行。 2. forward(请求转发)方法, request.getRequestDispatcher("/url").forward(request,response); 地址栏也不会改变,同样是在服务器端完成,但仅输出被转发的URL中的内容。forward()方法执行完后,它下面的代码将不再执行。 3. sendRedirect(重定向),只是客户重新发起一个请求,第二个请求指向其参数url。一般称做重定向,客户端的地址栏将改变为url值,是由客户端发起的第二次请求。参数中要写明具体的url地址,因为当客户端再次发送请求时,会直接请求web服务器根目录。要是要转发的一个html地址,它在WEB-INF文件夹下,那么要从servlet转发到这个 html地址,必须加上当前的web路劲名,这个路劲名可以通过request.getContextPath()获得,那么该转发代码可以为 response.sendRedirect(request.getContextPath()+"/login.html"); **注意:**重定向是浏览器向服务器重新发出请求,但转发相当于把request的范围扩大,例如: 在a界面有个连接<a href="b.jsp?id=1">,在b界面可以通过request.getAttribute("id")获得, 在b界面也有个连接<a href="c.jsp?name="123">,则在界面用request.getAttribute("id")就取不到值。这是每个连接就像一个重定向,相当于重新创建了一个request,当b->c时,a->b的request已经结束了。 接下来,在c的界面前加<jsp:forward page="d.jsp"/> ,那么变量name在c、d都有效,所以在d想取到参数name的值,不必要把参数值放到session里来扩大他的范围。

June 2, 2018 · 1 min · sunbufu