1.Java Web程序开发基于Servlet编程,编码到部署有四个步骤:
①编写Servlet;
②打包war文件;
③复制Tomcat到webapps目录;
④启动Tomcat;
2.Web工程一般分为src和webRoot两个目录,src放源码,webRoot放jsp、img及编译文件,实现显示层和代码层的分离。
webRoot下有META-INF和WEB-INF,META-INF。META-INF存放版本号、依赖包;WEB-INF为安全目录,只能通过服务端访问,客户端无法访问。在客户端要通过web.xml映射才能访问WEB-INF的文件。安全目录实现拦截器接受命令、控制转发请求,能降低网页注入风险。
一、简介
——————————————————————————
1.简介
Servlet 相当于MVC架构中的C(Controller),负责逻辑处理;而JSP相当于MVC架构中的V(View),负责表示层处理。Servlet 程序运行在web或应用服务器上,是HTTP服务器和数据库/应用之间的中间层,有权限访问Java API和数据库JDBC API。 Servlet 可用于收集网页表单的用户输入,呈现数据库的记录以及动态创建页面。
2.优势
①在web服务器地址空间内自行,无需创建进程来处理客户端请求;
②独立于平台,可用Java类库的全部功能;
③可通过sockets、RMI机制与applets、数据库或其他软件交互;
3.Servlet 任务
①读取客户端浏览器发送的显示数据(网页的HTML表单);
②读取客户端浏览器发送的隐式HTTP请求数据(cookies、媒体类型、压缩格式);
③处理数据并生成结果(可能包括数据库访问、RMI或CORBA调用、Web服务调用或直接计算);
④发送显示数据到浏览器(HTML、XML、Excel等);
⑤发送隐式HTTP响应到客户端(文档类型、cookies和缓存参数);
4.Servlet 包
Java Servlet 可以使用javax.servlet和javax.servlet.http包创建,是运行在有Java Servlet 规范解释器web服务器上的Java类。
二、环境设置
——————————————————————————
1.配置JDK
2.设置Web应用服务器:Tomcat
Apache Tomcat是基于Java Servlet 和JavaServer Pages技术的软件实现,可作为测试Servlet 的独立服务器
三、生命周期
——————————————————————————
1.Servlet 生命周期
①初始化后调用init();
②调用service()处理客户端请求;
③Servlet 销毁前调用destroy()方法;
④Servlet 最后由JVM进行GC回收;
2.init()
public void init() throws ServletException {
// 初始化代码...
}
只在Servlet 初始化时被调用一次,
3.service()
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
执行任务的主要方法,用于处理客户端的请求,并返回格式化响应。每接收一个Servlet 请求,Servlet 容器(Web服务器)就产生一个线程调用service(),检查HTTP请求类型(GET、POST、PUT、DELETE等)并对应地调用doGet、doPost、doPut、doDelete等方法。
service()方法由Servlet 容器调用,只需重写doGet()或doPost()即可。
4.doGet()
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
GET请求来自URL或HTML表单,由doGet()处理。
5.doPost()
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
POST请求来自指定了METHOD为POST的HTML表单,由doPost()处理。
6.destroy()
public void destroy() {
// 终止化代码...
}
只在Servlet 销毁时被调用一次,负责关闭数据库连接、停止后台线程、将Cookies或点击计数器写入磁盘以及将Servlet 对象标记为垃圾回收。
四、实例
——————————————————————————
Web应用开发常编写Servlet 类扩展javax.servlet.http.HttpServlet接口来处理HTTP请求。
1.编译Servlet
添加JAR包进CLASSPATH后(>set classpath={应用名(随意起)}
${应用名}
${url后缀,如/HelloWorld}
注:Tomcat对大小写十分敏感;
五、表单数据
——————————————————————————
1.Servlet 表单数据
浏览器可通过GET、POST方法将信息(表单数据)传递到Web服务器,再传往后台。
2.GET
浏览器默认通过GET向Web服务器传递信息,已编码的用户信息与页面用"?"分割:
http://www.test.com/hello?key1=value1&key2=value2
GET方法会在地址栏产生一个很长的字符串,不适用于传递敏感信息,且GET限制请求的字符串最多1024个字符。
这些信息使用QUERY_STRING头传递,可通过QUERY_STRING环境变量访问。Servlet 通过doGet()处理GET请求。
3.POST
POST打包信息的方式与GET相同,但POST不会将信息置为URL?字符串发送,而是以标准形式传到后台。Servlet 使用doPost()处理POST请求。
4.Servlet 读取表单数据
①request.getParameter()获取表单参数的值;
②getParameterValues()获取多次出现的参数值(复选框);
③getParameterNames()获取请求的所有参数列表;
5.使用URL的GET方法实例
URL(http://localhost:8080/HTTPResponse/UrlGetSer?name=菜鸟教程&url=www.runoob.com)想程序传递两个值name&url,使用HttpServletRequest.getParameter()能获取客户端传递的信息,然后在doGet()方法中进行处理。
6.使用表单的GET方法实例
HTML表单(需置于WEB-INF下)构建输入页面,再通过Servlet处理Get输入。
HTML里的
2.UploadServlet样例
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 上传文件存储目录
private static final String UPLOAD_DIRECTORY = "upload";
// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
/**
* 上传数据及保存文件
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 检测是否为多媒体上传
if (!ServletFileUpload.isMultipartContent(request)) {
// 如果不是则停止
PrintWriter writer = response.getWriter();
writer.println("Error: 表单必须包含 enctype=multipart/form-data");
writer.flush();
return;
}
// 配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
// 设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
// 中文处理
upload.setHeaderEncoding("UTF-8");
// 构造临时路径来存储上传的文件
// 这个路径相对当前应用的目录
String uploadPath = request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY;
// 如果目录不存在则创建
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
try {
// 解析请求的内容提取文件数据
@SuppressWarnings("unchecked")
List formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
// 迭代表单数据
for (FileItem item : formItems) {
// 处理不在表单中的字段
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
// 在控制台输出文件的上传路径
System.out.println(filePath);
// 保存文件到硬盘
item.write(storeFile);
request.setAttribute("message",
"文件上传成功!");
}
}
}
} catch (Exception ex) {
request.setAttribute("message",
"错误信息: " + ex.getMessage());
}
// *跳转到 message.jsp
request.getServletContext().getRequestDispatcher("/message.jsp").forward(
request, response);
}
}
3.message.jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"http://www.w3.org/TR/html4/loose.dtd">
${message}
十五、网页重定向
——————————————————————————
文档位置变动、负载均衡或者为了随机,都要用到网页重定向。
重定向方式:
①使用 response 对象的 sendRedirect() 方法,将响应以及状态码和新页面位置发送给浏览器
public void HttpServletResponse.sendRedirect(String location) throws IOException
②通过setStatus()和setHeader()实现
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{....
String site = "http://www.runoob.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
....}
十六、点击计数器
——————————————————————————
1.网页点击计数器
实现基于Servlet 生命周期的网页点击计数器需要采取的步骤:
①在 init() 方法中初始化一个全局变量。
②每次调用 doGet() 或 doPost() 方法时,都增加全局变量。
③如果需要,您可以使用一个数据库表来存储全局变量的值在 destroy() 中。在下次初始化 Servlet 时,该值可在 init() 方法内被读取。这一步是可选的。
④如果您只想对一个 session 会话计数一次页面点击,那么请使用 isNew() 方法来检查该 session 会话是否已点击过相同页面。这一步是可选的。
⑤您可以通过显示全局计数器的值,来在网站上展示页面的总点击量。这一步是可选的。
2.通过过滤器实现网站点击计数器
①在过滤器的 init() 方法中初始化一个全局变量。
②每次调用 doFilter 方法时,都增加全局变量。
③如果需要,您可以在过滤器的 destroy() 中使用一个数据库表来存储全局变量的值。在下次初始化过滤器时,该值可在 init() 方法内被读取, 这一步是可选的。
十七、自动刷新页面
——————————————————————————
Servlet 使用响应对象的setIntHeader()方法,将头信息"Refresh" 以及间隔值(单位秒)传给浏览器,可实现网页的定期刷新。
response.setIntHeader("Refresh", 5);
十八、发送电子邮件
——————————————————————————
发送电子邮件需要JavaMail API及Java Activation Framework(JAF),需要引入对应的依赖包javax.mail.jar和javax.activation.jar。
略
十九、Servlet 包
——————————————————————————
Java web 应用程序的程序目录结构由Servlet API规范指定,其WEB-INF的目录结构如下:
|myapp // HTML文件
|--images
|--WEB-INF // 程序的部署描述文件web.xml
|--classes // Servlet 类和其他类文件
|--lib
二十、调试技巧
——————————————————————————
1.System.out.println() 是作为一个标记来使用的,用来测试一段特定的代码是否被执行。也可以打印出变量值检查。
优点:System为Java核心部分,能被用于任何地方;无需断点,不干扰程序的执行流程。
2.ServletContext.log()打印日志到容器的日志文件。Tomcat的日志可在
3.使用调试applet或应用程序的jdb命令来调试Servlet。通过调试 sun.servlet.http.HttpServer,将其看成是HttpServer 执行 Servlet 来响应浏览器端的 HTTP 请求。调试前要为调试器设置好sun.servlet.http.Http-Server, servlet 及支持类的CLASSPATH。
*server_root/servlets设置在CLASSPATH会禁用servlet 的重新加载,但能使调试器在 HttpServer的自定义 Servlet 加载器加载 Servlet 之前在 Servlet 中设置断点。
在想要调试的Servlet代码中设置断点,然后通过 Web 浏览器使用给定的 Servlet(http://localhost:8080/servlet/ServletToDebug)向 HttpServer 发出请求,程序执行到断点处会停止。
4.使用注释定位bug,若注释代码块后bug消失,说明问题在注释块中。
5.查看客户端、服务器的头信息(HTTP请求和响应)。
6.其他技巧:
①要求浏览器显示它所显示的页面的原始内容。这有助于识别格式的问题。它通常是"视图"菜单下的一个选项。
②强制执行完全重新加载页面来确保浏览器还没有缓存前一个请求的输出。
③确认 servlet 的 init() 方法接受一个 ServletConfig 参数,并调用 super.init(config)。
二十一、国际化
——————————————————————————
通过区域设置能让网页呈现当地的语言、符号以及网站版本。 request 对象中返回 Locale 对象的方法:
java.util.Locale request.getLocale()
国际化(i18n):网站提供不同版本的翻译内容;
本地化(l10n):向网站添加资源,使其适应特定的文化区域,如网站译为印地文;
区域设置(locale):特殊的文化区域,通常以语言符号跟国家符号区分,如"en_US"表示针对US的英语区域设置。
略
二十二、相关资料
——————————————————————————
1.相关网站
①Sun's Site on Servlets ](http://java.sun.com/products/servlet/)- Sun 的官方网站上关于 Servlet 的相关资料。
②JSP Engine - Tomcat ](http://tomcat.apache.org/)- Apache Tomcat 是一个开源软件,实现了对 Java Servlet 和 JSP(JavaServer Pages)技术的支持。
③MySQL Connector/J](http://dev.mysql.com/downloads/connector/j/5.1.html) - MySQL Connector/J 是 MySQL 官方 JDBC 驱动程序。
④The JavaTM Tutorials](http://java.sun.com/docs/books/tutorial/index.html) - 该 Java 教程是为那些想用 Java 编程语言创建应用程序的编程人员提供的实用指南。
⑤JavaTM 2 SDK, Standard Edition ](http://java.sun.com/j2se/1.4.2/docs/index.html)- JavaTM 2 SDK, Standard Edition 的官网。
⑥Free Java Download](http://www.java.com/en/download/index.jsp) - 为您的桌面计算机下载 Java!
⑦Sun Developer Network](http://java.sun.com/reference/docs/) - Sun Microsystem 的官方网站,上面列出了所有的 API 文档,最新的 Java 技术、书籍和其他资源。
2.相关书籍
①Core JavaServer Faces
②Java7:A Beginner's Tutorial
③Head First Java
④Murach's Java Servlets and JSP
⑤Head First Servlets and JSP
⑥Servlet and JSP
——————————————————————————
参考自runoob.com,侵删。