目录
一. 基本概念
1. Servlet
Servlet实质上是一个Java类,是一种运行在支持Java应用服务器上的Web组件,它与普通Java类的区别在于它是一个专门处理请求和响应的Java类。其主要功能是:接受前端用户的请求,调用后端的逻辑处理程序,最终给客户返回响应。HttpServlet是Servlet API的核心类,其自定义的Servlet都是该类的子类。
那么这里为什么要引入Servlet呢?主要是因为HTML+JS的静态页面非常局限,不能灵活的处理页面和请求响应,所以引入Servlet + HTML来进行动态页面处理。
2. Tomcat
Servlet是一种特殊的java类,必须在服务器容器里面生存与工作。Tomcat就是这样一种服务器容器,它给Servlet提供生存环境(servlet必须在容器里启动),同时将Web请求封装成对象交给Setvlet处理,将Servlet响应封装成对象,然后返回给Web显示。
二. Tomcat运行过程
三. 环境配置
1. Tomcat服务文件
(1)你发布的项目文件必须放在webapp目录下才能被Tomcat扫描到;
(2)有关的servlet类放置到classes文件夹下;
bin | 包含启动/关闭脚本 |
conf | 包含不同的配置文件,包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件web.xml |
lib | 包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中 |
logs | 存放Tomcat的日志文件 |
webapp | 包含web项目示例,当发布web应用时,默认情况下把web文件夹放于此目录下 |
work | Tomcat自动生成,放置Tomcat运行时的临时文件(如编译后的JSP文件).如在Tomcat运行时删除此目录.JSP页面将不能运行.[ jsp生成的sevlet放在此目录下] |
classes | 你可以创建此目录来添加一些附加的类到类路径中.任何你加到此目录中的类都可在Tomcat的类路径中找到自身. |
2. 手动配置
2.1 编写Java Servlet类
该类主要用来处理请求和响应,且Servlet类必须有包名。
package characpter10;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
public void service(HttpServletRequestrequest,HttpServletResponse response)throws IOException,ServletException {
response.setContentType("text/html;charset=GB2312");//设置响应编码方式
PrintWriter out = response.getWriter();//用于输出html页面
String name = request.getParameter("name");
out.println("<html><body>");
if(name==null) {
out.print("你需要输入名字!");
}
else if(name.equals("Krito")) {
out.print("<h2>您好,欢迎 " + name + " 老师");
out.println("</h2>");
}
else {
out.print("<h2>您好,欢迎 " + name + " 同学");
out.println("</h2>");
}
out.println("</body></html>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.2 编写html页面
<html>
<head>
<title>test</title>
</head>
<body>
<form action="check" method="post">
<INPUT type="text" NAME="name" size="20">(*用户名)<br>
<INPUT type="submit" NAME="button" value="提交">
</form>
</body>
</html>
2.3 编译check类
我们需要的就是可以直接工作的.class文件。由于servlet类的编译文件是由tomcat提供的,所以需要用tomcat的 servlet-api.jar 文件来编译,其cmd编译命令如下:
javac -cp servlet-api.jar check.java
其编译结果如下:
2.4 在tomcat下组建web项目
(1)WebProject
(2)WEB-INF
WEB-INF是Java的WEB应用的安全目录,客户端无法访问,只能通过服务端访问,从而实现了代码的安全。在WEB-INF中主要是系统运行的配置信息和环境,主要有classes、config、lib文件夹和web.xml。
- classes文件夹:包含了站点所有用的 class 文件,包括 servlet class 和非servlet class;
- lib文件夹:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件;
- web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。让Tomcat认识servlet的名字,路径;
其中classes-characpter10:
2.5 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>//声明servlet名字以及类
<servlet-name>check</servlet-name>
<servlet-class>characpter10.check</servlet-class>
</servlet>
<servlet-mapping>//声明相应servlet的url路径
<servlet-name>check</servlet-name>
<url-pattern>/check</url-pattern>
</servlet-mapping>
</web-app>
2.6 结果展示
3. eclipse自动搭建
3.1 环境导入Tomcat
Windows--Preference--Server--Runtime Environments--Add--Tomcat 7.0
3.2 项目导入tomcat编译环境
(1)创建时导入可编译
(2)创建完后导入tomcat编译环境
右键项目--Build Path--Configure Build Path... --Libraries--Add Library--Server Runtime--tomcat 7.0--Apply--添加完成
3.3 运行服务
run on server
3.4 项目结构说明
(1)src文件:存放所有的.java,图片等其他资源文件。
(2)WebContent:存放所有的html,jsp文件。
(3)WEB-INF:存放web.xml以及.class文件,其内部的文件是不能通过客户端访问的。
四. Servlet基础
1. Request对象
(1)String getParameter:获取客户以GET方式发送的参数或者以POST方式提交的form表单的控件值。 例:String ans = request.getParameter("name");
(2)String[] getParameterValues:如果有多个同名的控件或参数,则该方法可以获得对应的多个参数值,并且放到一个String数组里,如复选框集(checkbox)。例:String []s = request.getParameterValues("name");
(3)String getMethod():获取请求方式(GET or POST);
(4)Object getAttribute():获取setAttribute()设置的参数对象;
request.getParameter和request.getAttribute的区别如下:
(1)方法:有setAttribute()方法,而没有setParameter()方法
(2)取值:getParameter取得通过类似post,get,或者url等方式传入的数据,由客户端传入服务器端。而getAttribute中,转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。
2. Response对象
(1)setContentType
在给调用者发回响应前,必须用该方法来设置HTTP响应的MIME类型。通常设置为:response.setContentType(“text/html,charset=utf-8”);但是注意MIME映射策略就是在网页中使用哪个应用程序(即插件),打开哪种文件。
(2)getWriter
返回PrintWriter对象,把Servlet的结果作为文本返回给调用者。PrintWriter对象自动把Java内部的Unicode编码字符转换成正确的编码以使客户端能够阅读。
PrinterWriter out = response.getWriter();
out.print()/println();//输出至MIME
3. 页面中文乱码处理
(1)请求中包含中文
//GET方式提交的请求:
String name = new String(request.getParameter("name") .getBytes("ISO-8859-1"), "utf-8");
//POST方式提交的请求 :
request.setCharacterEncoding("utf-8");
(2)响应页面中包含中文
//1.
response.setCharacterEncoding("utf-8");
//2.
response.setContentType(“text/html,charset=utf-8”)
4. Servlet页面转发与重定向
(1)页面重定向
结束本次用户的请求,发送新的请求给下一个页面,因为此时的请求和用户最初的请求已经不属同一请求了。重定向后在地址栏里最终显示的也是重定向以后页面的URL(浏览器URL变化)。
response.sendRedirect(url)
(2)页面转发
继续把当前的请求对象传递给转发后的页面,因此前后可以共用同一个请求对象(共享请求数据,如查询字符串)。转发后在地址栏里最终显示的是转发前页面的URL(浏览器URL无变化)。
request.getRequestDispatcher(url).forward (request,response)
5. Session会话与Cookie存储
5.1 Session基础
(1)session对象
客户端与服务器的一次会话,从客户访问服务器的一个Web应用开始,直到客户端与服务器断开连接为止。session对象存在于服务器的内存中。 session是javax.servlet.http.HttpSession的实例 。
HttpSession session = request.getSession();//来获取一个请求所属的会话。
session对象可用来存储用户的信息,这些信息可以在不同页面被传递。
(2)常用方法
public void setAttribute(String name, Object value);
//该方法使用指定的名称绑定一个对象到该 session 会话。
String use = (String)session.getAttribute("username");
//String use = session.getAttribute("username").toString();
public void invalidate();
//该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
public void setMaxInactiveInterval(int interval);
//该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。
5.2 Cookie基础
(1)Cookie概念
当用户浏览某网站时,网站服务器存储到客户机上的一个小文本信息,它可以记录用户的会话ID以及登录名、密码等信息,当用户再次来到该网站时,网站通过读取该用户的Cookie,便可以得知用户曾经访问该网站的相关信息。Cookie 的作用就是用于解决 "如何记录客户端的用户信息";
(2)常用方法
Cookie以“名-值”对的形式保存数据。
Cookie[] cookies = request.getCookies();
//获取Cookie数组
for (int i = 0; i < cookies.length; i++) {
out.println("cookie name:" + cookies[i].getName());
out.println("cookie value:" +cookies[i].getValue());
}
//遍历Cookie数组
public void setValue(String newValue);
//该方法设置与 cookie 关联的值。
public void setMaxAge(int expiry);
//该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
Cookie c = new Cookie("my_cookie_create_date",new Date().toString());
response.addCookie(c);
//创建添加Cookie