1.HttpServlet
init(ServletConfig)------Servlet生命周期中的初始方法,默认情况是服务器创建后第一次访问这个Servlet时调用,可以修改配置信息,使其在服务器一创建时就被调用;
修改配置信息的方法-----在web.xml的<servlet>下添加<load-on-startup>x<load-on-startup>,x是正整数,越小表示优先级越高
url路径的配置,完全匹配>目录匹配>(.xx)后缀名匹配>(/)缺省路径屁匹配
2.ServletContext
在服务器启动时候就会创建,作用域为整个当前Web项目
InputStream -- getResourceAsStream(src) 获得指定web项目中的文件的is;
String --- getRealPath(url) 获得指定文件的真实路径,带盘符的那种
String -- getInitParameter(name) 获得Web项目的初始化数据
初始化数据的设置方法:
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
3.HttpServletResponse
文件下载实现方法
设置两个头
1.Content-Disposition:attachment;filename="url"--设定程序处理数据的方式
2.Content-Type:application/x-msdownload--设定实体的mime类型
3.处理浏览器下载显示框的乱码---利用DownloadUtils处理,FIrefox使用的是Base64,其他用URL
response.getOutPutStream---获得一个输出流
重定向
响应码为200表示响应成功,而响应码为302表示重定向。所以完成重定向的第一步就是设置响应码为302。public void setStatus(int sc)-----设置此响应的状态代码。设置Location头,指定第二个请求的URL地址。public void setHeader(String name, String value)-------用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值便捷的重定向方法: void sendRedirect(String location) 【开发常用!!!!!】重定向的底层:/*response.setStatus(int sc);重定向sc=302response.setHeader("Location","url");*/
乱码问题
响应乱码:
先要解决发送数据给服务器时的乱码
response.setCharsetEncoding("utf-8")//即让服务器以utf-8解析数据
再解决浏览器显示乱码的问题
response.setHead("Content-Type","text/html;charset=utf-8")//即给浏览器设置一个头,告诉浏览器以utf-8解析
便捷方式
response.setContentType("text/html;charset=utf-8");
请求乱码
post请求时
request.setCharacterEncoding("utf-8");
get请求时需要自己进行重新编解码
因服务器使用iso8859-1解码,即
string = new String(string.getBytes("iso8859-1"),"utf-8");
4.HttpServletRequest
请求首行的方法
String -- request.getMethod() 获得请求的方式
String -- request.getContextPath() 获得该请求相对于主机的url,即若项目为xxx/xx则获得/项目名/xxx
String -- request.getRemiteAddr() 获得请求客户端的ip
请求头的方法
String -- getHeader(name) 获得指定的请求头的value
Enumeration -- getHeaders(name) 获得指定名称header的values,封装为一个枚举类型
Eunmeration -- getHeaderNames() 获得所有请求头的name,封装为枚举类型
请求体的方法
getParameter(name)---指定name的value
String[] -- getParameterValues(name)---指定naem的多个value,用于多选框之类
Enumeration -- getParameterNames() 获得所有的请求体中name,封装为枚举类型
Map -- getParameterMap() 获得所有请求体中的数据,以键值对封装
5.BeanUtils
BeanUtils对象.population(JavaBean,parameterMap)-----将Map中的数据封装到JavaBean中
类型转换
例:转换为Date类型
DateConverter dateConverter = new DateConverter();
dateConverter.setPattern("yyyy-MM-dd");
ConvertUtils.register(dateConverter, java.util.Date.class);
6.Cookie
Cookie为服务器创建,保存在客户端的数据
底层通过response.addHeander("Set-Cookie","name=value")创建
Cookie默认存活时间为一次会话,可以通过cookie.setMaxAge(int time)设置存活时间
time<0时表示该cookie为会话级别的,=0表示追杀,>0表示手动设置存活时间,单位为s
cookie.setPath()设置cookie的路径,当要能使用此cookie,则路径必须要包括该cookie的路径
cookie.setDomain(),设置Cookie的域,看不懂,研究API
response.addCookie(cookie)----将cookie存入客户端
Cookie[] -- request.getCookies --- 获得客户端请求中的所有cookie
概念:由服务器创建保存在客户端的会话技术
创建:
便捷方式:Cookie cookie = new Cookie(String name,String value);
底层:
创建:response.addHeader("Set-Cookie","username=zhangsan");
获取:request.getHeader("Cookie");
规范:
处了IE6是20个,其余的版本和其它浏览器都是50个cookie
cookie的默认大小为4KB
获得所有Cookie:
Cookie[] cookies = request.getCookies();
Cookie的路径:它只与你归还的路径有关!默认路径为当前你访问的这个Servlet路径。
<url-pattern>/abc/AServlet</url-pattern>
那么此时cookie的默认路径是:/项目名/abc
cookie的路径就是上面那个,如果想要将之前的cookie携带到服务器,你所写的路径就不需包含/项目/abc
设置cookie路径的方法:cookie.setPath();
Cookie的生命:默认是会话级别,你可以设置cookie的生命,方法为cookie.setMaxAge();如果是会话,参数<0;如果想要是持久级别的>0;当设置=0,cookie立即杀死
Cookie的域:cookie.setDomain("/");
其它方法:
响应cookie:response.addCookie(cookie);
获取cookie的名字:cookie.getName();
获取cookie的值:cookie.getValue();
7.Session
Session是服务器创建,保存在服务器的数据,session为域对象,作用域为一次会话
当一次会话开始,即浏览器像服务器发送请求,由服务器手动创建一个Session,当一次会话结束,即浏览器关闭,则session的JSESSIONID会丢失,session依旧存在,session的默认存活时间为30m,在Tomcat的默认web.xml中可以修改,可以手动调用session的invalidate方法来销毁session
概念:由服务器创建并保存在服务器的会话技术
创建:
默认情况:
request.getSession(); //如果session池里面有,就返回;如果没有就创建一个新的并返回
request.getSession(true); //如果session池里面有,就返回;如果没有就创建一个新的并返回
request.getSession(false); //如果session池里面有,就返回;如果没有就返回null
如果你访问的是一个JSP页面,那么他就会为你创建一个Session
Session是依赖cookie
session的默认存活时间是30分钟,当然你也可以手动销毁session(session.invalidate())
域对象的使用:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
获得ServletContext对象:
session.getServletContext();
三个域对象的对比:
ServletContext: 服务器启动创建关闭销毁 在整个WEB应用中都有效,范围太多,慎用(统计)
HttpSession: 默认手动调用或者访问JSP资源 在一次会话中有效。(登录)
HttpServletRequest 默认情况第一次请求,也可以配置;在一次请求中有效!/**
* 文件下载实现
*
* @author ZZ
*
*/
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 通过.html文件跳转,请求中包含的文件路径,通过request对象来获得路径名
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"), "utf-8");
/*
*设置 第一个响应头:response.setHeader("Content-Type", fileType);
* 其中fileType是文件的MIME类型 第二个头:response.addHeader("Content-Disposition",
* "attachment;filename="+filename);
* 告诉浏览器这是需要下载的一个文件,即使浏览器能够直接打开,也要给我一个下载框,filename它是文件的名称
*/
// 通过文件的相对路径名来获得文件的MIME类型
String mimeType = this.getServletContext().getMimeType(filename);
// 设置第一个头Content-Type;
response.setHeader("Content-Type", mimeType);
System.out.println(filename+"--------01");
System.out.println(request.getContextPath()+"--------03");
// 通过文件的相对路径调用servletContext的方法获取一个输入流对象is
InputStream is = this.getServletContext().getResourceAsStream(filename);
// 通过获得浏览器的信息来更改浏览器提示的信息User-Agent头中包括了浏览器的信息
String user_Agent = request.getHeader("User-Agent");
// 对浏览器进行判断,分别使用不同的乱码处理方式
if (user_Agent.contains("Firefox")) {
// 说明是火狐浏览器
filename = base64EncodeFileName(filename);
} else {
// 其它浏览器使用URL编码
filename = URLEncoder.encode(filename, "utf-8");
}
System.out.println(filename+"--------02");
// 设置第二个头Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 通过response对象来获得一个输出流os
ServletOutputStream os = response.getOutputStream();
// IO流的文件复制
int length = 0;
byte[] bytes = new byte[1024];
while ((length = is.read(bytes)) != -1) {
os.write(bytes, 0, length);
}
is.close();
os.close();
}
/**
* 9.火狐浏览器解决下载框的中文乱码方法
*
* @param fileName
* @return
*/
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
/**
* 文件上传
*form表单上传文件
*method="post"
*enctype="multipart/form-data"
*/
public String saveProduct(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 先建立一个文件工程,两个参数,一个表示存放多大后进行flush刷新,另一个表示工厂的位置
String realPath = request.getServletContext().getRealPath("/products");
// 存储10M后进行刷新
FileItemFactory factory = new DiskFileItemFactory(1024 * 1024 * 10, new File(realPath));
// 建立一个Servlet文件上传对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 设置文件上传大小的限制
fileUpload.setSizeMax(50 * 1024 * 1024);
Map<String, Object> map = new HashMap<String, Object>();
try {
// 获得所有提交数据组成的迭代器对象
@SuppressWarnings("unchecked")
List<FileItem> list = fileUpload.parseRequest(request);
if (list != null) {
// 说明有提交参数
Iterator<FileItem> iterator = list.iterator();
while (iterator.hasNext()) {
// 遍历这个迭代器
FileItem fileItem = iterator.next();
// 判断是否是file普通域对象
if (fileItem.isFormField()) {
// 说明是普通表单域对象
// 获得提交数据的key,即name
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8");
map.put(name, value);
} else {
// 说明文件表单域对象,进行文件上传
// 获得文件名
String filedName = fileItem.getName();
String name = fileItem.getFieldName();
// 创建文件对象
File file = new File(realPath + "/" + filedName);
map.put(name, "products/" + filedName);
// 进行写入
fileItem.write(file);
}
}
}
// 将数据存入数据库
Product product = new Product();
BeanUtils.populate(product, map);
// 存储product对象
product.setPid(UUIDUtils.getId());
product.setPflag(0);
productService.saveProduct(product);
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}