三月份27日 Servlet扩展
Servlet加强
1.Path总结(路径总结):
(1)java项目:
File file = new file(“”);
*在控制台上,使用java命令,输出路径是当前java命令所处的路径:工作台的路径\bin
*在使用IDE运行时,仅为工作台路径,不含bin
将项目打成jar包
右键Export-->Jar 保存
bin中的内容就是JAR中的内容
* “/” 相对路径,
相对于当前盘符的路径,即获取当前盘符
* 获得路径使用类加载器
Hello.class.getClassLoader().getResource(“”); 返回URL,直接指到bin,即所在文件的根目录
Hello.class.getClassLoader().getResource(“\”); 不允许使用,返回null
2.ServletContext
* Context 上下文
此对象是对当前web项目上下文的描述
Init(ServletConfig)--> config.getServletContext()
Tomcat 为每一个项目都创建了一个区域,这个区域就是ServletContext
Tomcat中一个目录:
Webapps 用于存储项目,并对每一个项目分别进行管理
ServletContext 是一个接口
方法:
getRealPath(path) 给一个相对路径,返回真实路径
路径全部为字符串类型,不管文件是否存在,均可以表示出其真实路径:”WebName/Path”
创建Servlet复习:
1.写一个类,继承HttpServlet
2.覆盖doGet、doPost
3.在web.xml中配置Servlet
在init中,config.getServletContext() 可以引用内存
管理当前项目的所有文件
获得实际路径,要求“\”开头:找到WebName下一级的目录
//获得资源文件
ServletContext sc = this.getServletContext();
//context root
当前ServletContext所指的web项目的根
Tomcat ----> webapps/webName
Myeclipse--->webName/WebRoot
获得资源
getResource(“/……”) / 开头,返回URL
URL中的getPath方法可以将其转换为String类型
getResourceAsStream 返回一个输入流(InputStream)
测试时用getResource,可以显示路径
编写时用getResourceAsStream 可以进行IO操作
ServletContext属性与配置
getRealPath 获取实际路径
·操作数据:
add set get remove delete
getAttribute(String name) 给名字返回属性值
setAttribute(String name,Object obj)给一个名字、值,设置属性值
removeAttribute(String name)给一个名字,删除属性值
1、set部分
package cn.yswl.attr;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SetAttr extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletContext
ServletContext sc= this.getServletContext();
//设置属性值
sc.setAttribute("name", "ly");
System.out.println("属性值配置成功!!!");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
2.get部分
package cn.yswl.attr;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetAttr extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletContext
ServletContext sc= this.getServletContext();
//获取属性值
String value = (String) sc.getAttribute("name");
System.out.println("属性值获取成功!!!值为: "+value);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
·给当前项目配置内容:
配置文件的位置 web.xml
配置内容(例如配置数据库:url、驱动,账号、密码等)
·使用标签(可配置多个):
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
·读取配置的内容:
getInitParameter(name) 给名字,返回值
getInitParameterNames() 返回枚举类
Web的相对路径
前提:相对当前的页面
使用分类:
abc 与当前页面同级的目录或servlet
/abc 相对于web站点,……/webapps/
./abc 当前目录,与第一种情况相同
../abc 上一级目录
3.ServletResponse
response(响应 服务器-->浏览器)将需要发送给浏览器的所有数据全部存放在此对象上。
·发送数据 使用流操作,将所需的数据存放在流中,发送给浏览器
·字节流
将数据发送给浏览器
·1.获取流
·2.准备数据
·3.将数据写入到获得的流
package cn.yswl.date;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetDate extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/***********************************使用response,来进行从服务器到浏览器端数据的传输*************************/
//获取数据流
ServletOutputStream is = response.getOutputStream();
//准备数据
String date = new Date().toString();
//写入字节流
is.print(date);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
总结: getOutputStream和getWriter不能同时使用。
字节流:getOutputStream 一般在程序中使用具有拷贝功能
字符流:getWriter 一般在程序中发送数据内容的时候
response发送中文:
字节流发送中文:
·设置响应浏览器的编码 setContentType(“text/html; charset= 编码类型”)
······通知tomcat和浏览器都使用该编码类型
·在getBytes()中写入编码类型
package cn.yswl.date;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.util.resources.CalendarData;
public class GetDate extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取流
ServletOutputStream out = response.getOutputStream();
response.setContentType("text/html;charset=UTF-8");
//获取数据
String data = "获取当前时间:"+new Date().toString();
//写入流
out.write(data.getBytes("UTF-8"));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
·通过字符流进行数据的发送
1.获取字符流
2.创建数据
3.将数据写入字符流
package cn.yswl.date;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class NewCNServ extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//通过字符流进行服务器--->浏览器数据发送
//配置字符集
response.setContentType("text/html;charset=GB2312");
//获取字符流
PrintWriter pw = response.getWriter();
//创建数据
String data = "中文数据 GB2312字符集";
//写入字符流
pw.print(data);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
4.ServletRequest
将数据从浏览器----->服务器,是数据存放的地方
GET和POST两种请求方式:
GET:数据追加在url中,适合于小文本
POST:在请求体中,安全性更高
浏览器---------->发送数据给服务器
表单form 属性: method(post/get) action(接收数据的路径)
获取表单数据 request中的getParameter(name) 根据表单的name属性,返回值。
1.网页文件
package cn.yswl.date;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormPage extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter printer = response.getWriter();
printer.print("<h3>表单练习</h3>");
printer.print("<form action=\"/WebDate/formData\" method=\"get\">");
printer.print("姓名:<input maxlength=\"25\" type=\"text\" name=\"usersname\"/>");
printer.print("密码:<input maxlength=\"25\" type=\"password\" name=\"userspwd\"/>");
printer.print("<input type=\"submit\" value=\"提交\"/>");
printer.print("</form>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
2.提交数据
package cn.yswl.date;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormData extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("usersname");
System.out.println("姓名: "+name);
String pwd = request.getParameter("userspwd");
System.out.println("密码:"+pwd);
System.out.println("加密后: "+pwd.hashCode()+12345);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
单选项和多选项会返回标签的value值
多选项 使用 getParamerValues()
request处理中文
对于post: 需要通知tomcat用户提交的数据的字符集
request中的setCharacterEncoding(String)
配置字符集
对于get: 浏览器已经将中文进行编码,因此,我们需要在Servlet中对其进行解码:
获取用户get请求提交的数据:
getQueryString() 返回String
将其传入URLDecoder中的decode(name,字符集)中的第一个参数
String str = request.getQueryString();
String next = URLDecoder.decode(str, "UTF-8");
System.out.println(next);
因此,在表单中使用中文的时候,不要使用get,处理很麻烦!!