一、将Servlet的jar包导入web工程中:
Servlet的jar包所在目录:apache-tomcat-x/lib/servlet-api.jar
将jar包放入此目录:工程/WebContent/WEB-INF/lib
二、配置Servlet类到web站点下:
映射的虚拟目录:
/ :缺省,找不到时运行
/* :匹配任意名称
*.do :匹配任意扩展名为.do名称
<servlet>
<!-- 别名UserServlet -->
<servlet-name>UserServlet</servlet-name>
<!-- 类名 -->
<servlet-class>com.yyh.hkw.servlet.UserServlet</servlet-class>
<!-- 秒数,启动服务器时自动装载 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 别名UserServlet -->
<servlet-name>UserServlet</servlet-name>
<!-- 映射的虚拟目录,"/"代表根目录 -->
<url-pattern>/*</url-pattern>
</servlet-mapping>
三、Servlet类:
实现Servlet的子类:GenericServlet类,HttpServlet类
方法:
init() 第一次运行时调用的方法,用于初始化
service(ServletRequest req,ServletResponse res) 用户请求时调用
getServletConfig() 返回ServletConfig类对象
getServletInfo()
destroy() 对象结束时运行
四、HttpServlet类(一般继承此类):
doGet方式请求时触发:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
doPost方式请求时触发:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
五、Servlet多线程问题:
方法一:
将代码写入synchronized()方法中
方法二:
写的类实现SingleThreadModel类,创建不同的Servlet对象
六、ServletConfig类:
1.方法:
ServletConfig config = getServletConfig();
// 获得全部配置param-name的名称
config.getInitParameterNames();
// 得到名称对应的值
String paramValue = config.getInitParameter("param-name名称");
// 得到servlet-name名称
String name = config.getServletName();
// 得到ServletContext对象
ServletContext context = config.getServletContext();
2.获取web.xml中init-param的值:
(1)在servlet节点中加入init-param节点:
<servlet>
<init-param>
<!-- key名 -->
<param-name>key1</param-name>
<!-- 值 -->
<param-value>value1</param-value>
</init-param>
</servlet>
(2)在HttpServlet继承类中获取init-param的值:
ServletConfig config = getServletConfig();
// 得到名称对应的值
String value1 = config.getInitParameter("key1");
七、ServletContext类 :
说明:
称为域,多个线程(Servlet)可以共用一个ServletContext对象,实现多个Servlet程序之间的通讯。
1.利用ServletContext传递参数与获取:
ServletContext context = getServletContext();
//将key=value保存在ServletContext域中
context.setAttribute("key1", "value1");
//别的Servlet或jsp中可直接获取key对应的值
String value1 = context.getAttribute("key1").toString();
2.利用ServletContext读取web.xml的全局参数:
(1)在web.xml中增加参数:
<context-param>
<!-- key名称 -->
<param-name>key1</param-name>
<!-- 值 -->
<param-value>value1</param-value>
</context-param>
(2)在Servlet中获取context-param中的参数:
ServletContext context = getServletContext();
context.getInitParameterNames(); //获得param-name参数列表
String value1 = getInitParameter("key1"); //得到key1参数的值
3.利用ServletContext得到文件路径:
//1.获取ServletContext
ServletContext context = getServletContext();
Properties p = new Properties();
//2.获取文件路径
String filePath = context.getRealPath("/WEB-INF/config/a.properties");
//2.获取文件输入流
//InputStream in = context.getResourceAsStream("/WEB-INF/config/a.properties");
//2.获取文件输入流
InputStream in = this.getClass().getClassLoader().getResourceAsStream("../../WEB-INF/config/a.properties");
//3.装载文件
p.load(new FileInputStream(filePath));
//3.装载文件
//p.load(in);
//4.读取文件值
String value1 = p.getProperty("key1"); // 得到值
八、HttpServletRequest类 :
1.获取头信息:
//获取头字段集合
Enumeration<String> headers = req.getHeaderNames();
while (headers.hasMoreElements()) {
//获取头字段key
String key = (String) headers.nextElement();
//获取头字段value
String value = req.getHeader(key);
}
2.获取传过来的参数:
//1.获取指定参数值
String username = req.getParameter("username");
//1.获取参数集合
Map<String, String[]> keyMap = req.getParameterMap();
Iterator<String> iter = keyMap.keySet().iterator();
while (iter.hasNext()) {
//获取参数名
String key = iter.next();
//获取参数值
String value = keyMap.get(key)[0];
}
3.处理参数乱码:
(1)GET请求乱码处理:
//处理参数乱码
String result = new String(req.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
(2)POST请求乱码处理:
//设置POST请求体编码格式
req.setCharacterEncoding("UTF-8");
九、HttpServletResponse类 :
1.方法:
//输出字符流(这个输出流不用关,服务器会自动关)
PrintWriter writer = resp.getWriter();
//输出字节流(这个输出流不用关,服务器会自动关)
OutputStream out = resp.getOutputStream();
//设置状态码
resp.setStatus(200);
//设置返回头
resp.setHeader("key1", "value1");
//设置内容类型
resp.setContentType("text/html; charset=UTF-8");
//设置内容长度
resp.setContentLength(100);
2.处理返回乱码问题:
//设置返回内容编码格式
resp.setCharacterEncoding("UTF-8");
//设置返回内容编码格式
resp.setHeader("ContentType", "text/html; charset=UTF-8");
//设置返回内容编码格式
resp.setContentType("text/html; charset=UTF-8");
3.跳转页面:
/为正斜杠:
表示url地址,访问web地址时用正,例如:http://localhost:8080、/user.html
\为反斜杠:
表示真实本地路径,例如:c:\windows;
在java流中要用“\\”,第一个为转义符,第二个为真正的反斜杠,例如:new FileOutputStream("c:\\")。
(1)转发跳转(带参数):
//转发跳转,user.html位于WebContent目录下
req.getRequestDispatcher("/user.html").forward(req, resp);
(2)重定向跳转(不带参数):
//获取web根目录
String rootPath = req.getContextPath();
//重定向跳转,user.html位于WebContent目录下
resp.sendRedirect(rootPath + "/user.html");
4.设置缓存时间:
// 设置缓存时间,缓存期间不访问服务器,只读取本地缓存内容
resp.setDateHeader("expires", System.currentTimeMillis() + 1000 * 60 * 60);
十、在web.xml中设置session超时时间:
<session-config>
<!-- session超时时间为2分钟 -->
<session-timeout>2</session-timeout>
</session-config>