web应用的重要配置文件,一切涉及到对web应用中的web资源进行配置,都是在web.xml文件中进行设置的,如:
1、某个web资源配置为网站首页(设置index.xml为首页)
index.html
如需要在web服务器中配置一个网站,需使用Host元素进行配置,如:
在Windows中的注册方式为修改计算机的hosts文件,如:
c:\Windows\System32\drivers\etc\hosts
在文件中添加如:
192.168.25.21(电脑IP) www.djh.com
对于web应用可以使用命令进行打包,后缀名打包为war,如:
web应用:news
打包:jar -cvf news.war news
工具:
keytool -genkey -alias tomcat -keyalg RSA
-alias:表示的是定义别名为tomcat
RSA:表示采用的算法
配置:在tomcat服务器的server.xml文件中添加如下代码
使用telnet程序连接web服务器,可以使用HTTP协议获取某个页面,快速了解HTTP协议的作用,如:
在tomcat的webapps目录下有一个news应用,其中有一个1.html,则通过命令行输入下列命令可以连接并查看
telnet localhost 8080(服务器端口)
(回车)
GET /news/1.html HTTP/1.1
(连续回车两次可查看结果)
HTTP请求
一个完整的HTTP请求包括以下内容:
一个请求行、若干消息头、以及实体内容,如:
请求行:(用于描述客户端的请求方式、请求的资源名称以及使用的HTTP协议版本)
GET /news/my.html HTTP/1.1
多个消息:(用于描述客户端请求的主机地址以及客户端的一些环境信息等)
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Reference: http://localhost/link.asp
请求方式有:
POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
常用的为:GET与POST
GET与POST的区别:
GET请求,可以在请求的URL地址后以?的形式带上提交给服务器的数据,多个数据之间以&进行分割,如:
GET /mail/1.html?name=abc&password=123 HTTP/1.1
HTTP请求的常用头:
Accept:text/html,image/* (告诉服务器,客户端支持的数据格式)
Accept-Charset:ISO-8859-1 (告诉服务器,客户端采用的编码)
Accept-Encoding:gzip,compress (告诉服务器,客户端支持的数据压缩格式)
Accept-Language:en-us,zh-cn (客户端的语言环境)
Host:www.djh.com.cn:80 (表示请求的主机)
if-Modified-Since:Tue, 11 Jul 2016 18:23:59 GMT (告诉服务器,资源的缓存时间)
Referer:http://www.djh.com.cn/index.jsp (告诉服务器,是从哪个资源来访问服务器)
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36) (客户机的软件环境)
Cookie (向服务器带数据)
Connection:close(Keep-Alive) (表示连接状态)
Date:Thu, 11 Aug 2016 10:32:14 GMT
HTTP响应:
一个HTTP响应代表服务器向客户端回送的数据,它包括:
一个状态行、若干消息头以及实体内容
如:
HTTP/1.1 200 OK //状态行(用于描述服务器对请求的处理结果)
Server:Apache-Coyote/1.1 //多个响应头(用于描述服务器的基本信息以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会它送回来的数据)
Date:Thu, 11 Aug 2016 10:32:14 GMT
Content-Length: 18
Content-Type:text/html
Content-control:private
//空行
//实体内容(代表服务器向客户端回送的数据)
....
状态行:
格式:
HTTP版本号 状态码 原因叙述
如:
HTTP/1.1 200 OK
-状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数,响应状态码分为5类,如下:
100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299:表示成功接收请求并已完成整个处理过程,常用200
300~399:为完成请求,客户需进一步细化请求,如:请求的资源已经移动一个新地址,常用302(会携带一个location)、304与307(和缓存相关)
400~499:客户端的请求有错误,常用404、403
500~599:服务器端出现错误,常用500
HTTP常用的响应头:
Location:http://www.djh.com/index.jsp (配合状态码302使用,用于告诉客户端寻找的资源)
Server:Apache-Coyote/1.1 (告诉客户端服务器的类型)
Content-Encoding:gzip (告诉客户端数据使用的压缩格式)
Content-Length:18
Content-Language:zh-cn
Content-Type:text/html; charset=GB2312 (通知客户端回送数据的类型)
Last-Modified:Wed, 10 Aug 2016 11:32:19 GMT
Refresh:1;url=http://www.djh.com (通知客户端间隔多长时间刷新一次)
Content-Disposition:attachment; filename=aaa.zip (通知客户端以下载的方式打开数据,filename表示保存的文件名)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag:VV/"7777-1242234904000" (缓存相关的,可以做到时时更新)
Expires:-1 (通知客户端将回送的数据资源缓存多长时间,-1与0表示不缓存)
Cache-Control:no-cache (通知客户端不缓存数据)
Pragma:no-cache (通知客户端不缓存数据)
Connection:close(Keep-Alive)
Date:Thu, 11 Aug 2016 10:55:36 GMT
如:ServletDemo:
package com.djh.servlet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletDemo
*/
@WebServlet("/ServletDemo")
public class ServletDemo extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.create a data
String str = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
System.out.println("before compress :" + str.getBytes().length);
//2.create Byte Array Output Stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//3.create a GZIP stream
GZIPOutputStream gzos = new GZIPOutputStream(baos);
//4.start zip data
gzos.write(str.getBytes());
//5.close gzos and baos
gzos.close();
baos.close();
byte gzip[] = baos.toByteArray();
System.out.println("After compress : " + gzip.length);
//设置数据的压缩格式
response.setHeader("Content-Encoding", "gzip");
response.setHeader("Content-Length", gzip.length + "");
//set the refresh time,表示页面每隔5秒刷新一次
// response.setHeader("Refresh", 5 + "");
// response.setHeader("Refresh", "5; url='http://www.baidu.com'"); //表示每隔5秒刷新至百度界面
response.setHeader("Content-Disposition", "attachment; filename='4.java'"); //设置以下载的方式打开数据,并保存文件名为4.java的文件
//response data
response.getOutputStream().write(gzip);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
HTTP请求头字段:
Range头只是服务器只传输一部分Web资源,这个头可以用来实现断电续传功能,Range字段可以通过三种格式设置要传输的直接范围:
Range: bytes=1000-2000 //表示传输范围从1000到2000字节
Range: bytes=1000- //表示传输Web资源中第1000个字节以后的所有内容
Range: bytes=1000 //传输最后1000个字节
HTTP响应消息头字段
Content-Range:指定了返回的Web资源的直接范围,这个字段值的格式是如下:
Content-Range: 1000-3000/5000
Servlet接口实现类
默认两个实现类:
GenericServlet、HttpServlet
servlet的配置文件是在web.xml文件中进行的,使用servlet与servlet_mapping完成配置
一个servlet-mapping元素用于映射一个已注册的Servlet的一个对外访问路径,其包含两个子元素:servlet-name与url-pattern,分别用于指定Servlet的注册名称和Servlet的对外访问路径,如:
news
com.djh.cn.NewsServlet
news
/newswebapp
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式
第一种格式是:“*.扩展名”
AnyName
*.html
第二种格式:以正斜杠(/)开头并以“/*”结尾(匹配任意的)
AnyName
/action/*
关于servlet中的子元素load-on-startup
servlet-on-startup元素中的数据越小表示的优先级越高,如:
AnyName
包名+类名
2
如果某个Servlet的映射路径仅仅是一个正斜杠(/),那么这个Servlet就称为当前web应用程序的缺省Servlet
Servlet配置:
ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个
data
djh
charset
utf-8
url
jdbc:mysql://localhost:3306/java
...
web容器在创建servlet实例对象时,会自动将初始化参数封装到Servlet对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet,在doGet或doPost方法中可以获取配置对象,如:
public class ServletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//get the single parameter value
String val = this.getServletConfig().getInitParameter("user");
System.out.println(val);
//get the all parameter value
Enumeration enu = this.getServletConfig().getInitParameterNames();
while(enu.hasMoreElements()){
String name = (String) enu.nextElement();
String value = this.getServletConfig().getInitParameter(name);
System.out.println(name + ": " + value);
}
response.getOutputStream().write("Success
".getBytes());
}
}
ServletContext对象
一个WEB应用中的所有Servlet共享同一个ServletContext对象,Servlet对象之间可以通过ServletContext对象来实现通讯或数据共享,也即是WEB应用之间的数据通讯,如:
//先运行ServletDemo2应用,再运行ServletDemo3应用
public class ServletDemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String str = "djh";
this.getServletContext().setAttribute("data", str);
}
}
public class ServletDemo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String str = (String) this.getServletContext().getAttribute("data");
System.out.println(str); //djh
}
}
Servlet转发技术,getRequestDispatcher()方法,如:
public class ServletDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String str = "This is Servlet forward technology";
//使用getServletContext传递数据,不建议使用,会存在线程安全问题,建议使用request域
this.getServletContext().setAttribute("data", str);
//Servlet转发技术,获取转发对象
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/1.jsp");
//转发
rd.forward(request, response);
}
}
1.jsp:
Insert title here
<%
//在JSP中,使用application代表context,如下:
String data = (String)application.getAttribute("data");
out.write(data);
%>
ServletContext对象读取资源文件
读取资源的方式:
方式一:getResourceAsStream()方法
从properties文件中读取,使用getResourceAsStream(path)方法
1、当properties文件在src目录下时,path的值为:
/WEB_INF/classes/文件名.properties
2、当文件在包名下时,path的值为:
/WEB-INF/classes/包名转变的路径名/文件名.properties
如:在包名com.djh下的db.properties
/WEB-INF/classes/com/djh/db.properties
3、当文件直接在web应用路径下时,path值为:
/WEB-INF/文件名.properties
方式二,使用FileInputStream绝对路径的方式读取
获取资源文件的绝对路径:
String path = this.getServletContext().getRealPath(path); //path的值即是方式一中的path值
使用文件流读取
FileInputStream fis = new FileInPutStream(path);
使用properties的方式读取资源文件
Properties pros = new Properties();
pros.load(fis);
String str1 = pros.getProperty("name");
......
方式三,通过类装载器的形式
使用类装载器的getResource()方法获取文件资源URL,再通过getPath()方法获取绝对路径
String path = 类.class.getCalssLoader().getResoource("资源文件路径").getPath();
通过传统读文件方式FileInputStream读取资源文件
FileInputStream fis = new FileInPutStream(path);
response与request对象:
HttpServletResponse:
方法:
setStatus(int sc)、setHeader(String name, String value)、getWriter()、getOutputStream()
response常见应用
向客户端输出中文数据(使用OutputStream输出1时,用户看到的不是1)
public class ServletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setHeader("Content-type", "text/html;charset=UTF-8"); //设置客户端以什么编码打开,写错时,浏览器会提示以下载的形式打开
String data = "这是中文字符使用字节流输出";
//获取输出字节流
OutputStream os = response.getOutputStream();
//向response写入数据
os.write(data.getBytes("UTF-8")); //带参表示以什么编码形式写入
}
}
使用字符流时注意编码格式为,可以使用如下方式更改编码格式
response.setCharacterEncoding("utf-8"); //设置response使用的码表
文件下载和中文文件的下载
如果下载的文件为中文文件名,则文件名需要经过url编码,如:
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encoder(filename, "UTF-8"));
输出随机图片(BufferedImage、ImageIO),如:验证码的应用
汉字在Unicode中的区间:汉字区间:0x4E00→0x9FA5(Unicode码表)(\u4e00-\u9fa5)
//构建图片
BufferedImage image= new BufferedImage(wdth, height, BufferedImage.TYPE_INT_RGB);
//获取图形对象
Graphics graph = image.getGraphicas();
//设置背景色
setBackGround(graph);
setBorder(graph); //设置边框
drawRandomLine(graph); //画随机线
drawRandomNum((Graphics2D)graph); //写随机数
response.setContentType("image/jpeg");
response.setHeader("expries", -1); //设置浏览器不缓存
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
ImageIO.write(image, "jpg", response.getOutputStream()); //向response写入图片数据
private void setBackground(Graphics g){
g.setColor(Color.WHITE);
g.fillRect(width,height);
}
private void setBorder(Graphics g){
g.setColor(Color.BLUE);
g.drawRect(xpos, ypos, width-2*xpos, height-2*ypos);
}
private void drawRandomLine(Graphics g){
g.setColor(Color.GREEN);
for(int i = 0; i = count; i++){ /count表示画多少条线
//设置线的起始坐标
int Xstart = new Random().nextInt(width);
int Ystart = new Random().nextInt(height);
//设置线的终点坐标
int Xend = new Random().nextInt(width);
int Yend = new Random().nextInt(height);
g.drawLine(Xstart, Ystart, Xend, Yend);
}
}
private void drawRandomNum(Graphics2D g){
g.setColor(Color.BLACK);
g.setFont(new Font("consolas", Font.BOLD, font_size));
for(int i = 0; i < cnt; i++){
//汉字区间:0x4E00→0x9FA5(Unicode码表)(\u4e00-\u9fa5)
int degree = new Random.nextInt()%30; //表示-30与30度以内的旋转
String str = "常用汉字码表";
String fnt = str.charAt(new Random().nextInt(str.length())) + "";
//调用Graphics2D的rotate()方法旋转字体
g.rotate(degree*Math.PI/180, , font_size);
g.drawString(fnt, i + 5 + (i*(font_size + 10)), font_size); //加5表示距边框一段距离
g.rotate(-degree*Math.PI/180, , font_size)
}
}
发送http头,控制浏览器定时刷新网页(refresh)
设置refresh头属性,如:
response.setHeader("refresh", "5"); //5秒刷新一次
response.setHeader("refresh", "5;url='URL地址'"); //表示5秒后将跳转至url所指向的地址页面
发送http头,控制浏览器禁止缓存当前文档内容(expires),如:
response.setHeader("expires", System.currentTimeMillis() + 1000*60); //表示保存一分钟的数据,一分钟之后重新发请求
通过response实现请求重定向:(注意转发与重定向的场合)
实现方式:
如:
response.sendRedirect("/news/index.jsp");
//相当于:
//response.setStatus(302);
//response.setHeader("location", "/news/index.jsp");
HttpServletRequest:
获取客户机信息方法:
getRequestURL:返回客户端发出请求时的完整URL,如:
http://www.sina.com/news/1.html
getRequestURI:返回请求行中的资源名部分,如:
news/1.html
对于中文数据的提交需要先编码,后提交(在获取数据之前,设置请求的编码格式),如:
request.setCharacterEncoding("utf-8"); //针对于POST提交有效
//对于GET方式的提交,可以使用反向ISO-8859-1查找,如:
username = request.getParameter("username");
username= new String(username.getBytes("iso8859-1"), "utf-8";
request常见应用
方法:
setAttribute、getAttribute、removeAttribute、getAttributeNames
-MVC设计模式:
M:model(JavaBean)
V:view(JSP)
C:control(Servlet)
include方法:
如:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String data = "this is middle text
";
request.getRequestDispatcher("/page/1.jsp").include(request, response);
request.setAttribute("data", data);
request.getRequestDispatcher("index.jsp").include(request, response);
request.getRequestDispatcher("/page/2.jsp").include(request, response);
}
//1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert title here
This is first JSP file.
//index.jsp
<%
String data = (String)request.getAttribute("data");
out.write(data);
%>
//2.jsp
This is Second JSP file.
保存会话数据的两种技术:
Cookie:
Cookie API
Cookie应用:
public class CookieDemo1 extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*
* 测试cookie,使用浏览器上次访问时间的例子
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应数据的编码格式
response.setCharacterEncoding("UTF-8");
//2、设置浏览器打开的编码格式
response.setContentType("text/html;charset=UTF-8");
//3、获取响应流
PrintWriter pw = response.getWriter();
//4、获取Cookies数组
Cookie[] cookies = request.getCookies();
//5、先判断Cookie是否含有Cookie,有则遍历Cookies数组,获取相应的Cookie,否则不执行
if(cookies != null){
for(int i = 0; i
Session:
Session是基于Cookie的,如下:
//session创建时,会创建一个相应的Cookie,并回写给客户端
HttpSession session = request.getSession();
String sessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionId); //通过session创建的Cookie的名字为JSESSIONID
//Cookie可以设置有效期
cookie.setMaxAge(time); //time表示的是多少秒
response.addCookie(cookie); //回写Cookie
使用response的encodeURL方法可以设置url,会在url后自动添加jsessionid,如:
String url = response.encodeURL("webappurl");