操作环境IDEA
首先创建项目
创建完成后导入 java ee jar包
配置tomcat
修改TomCat的默认访问页面
<welcome-file-list> <welcome-file>xx.html</welcome-file> </welcome-file-list>
缺省的默认访问页面是index.html
也可以指定一个servlet来作为默认访问页面,前提是这个servlet可以推送一个网页。
在src下创建 com.xx.control包,servlet一般放在control下。一个简单的HttpServlet
package com.xx.control;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TwoServlet")
public class TwoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mt = request.getMethod();
String uname = request.getParameter("uname");
System.out.println("用户名: "+ uname);
System.out.println("方法: " + mt);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mt = request.getMethod();
String uname = request.getParameter("uname");
System.out.println("用户名: "+ uname);
System.out.println("方法: " + mt);
}
}
然后在web目录下配置WEB-INF中的web.xml
<servlet> <servlet-name>WYF</servlet-name> <servlet-class>com.lh.control.OneServlet</servlet-class> <load-on-startup>10</load-on-startup> <!-- 设置为启动tomcat时即加载该实例,数字越小 加载优先级越高 --> <!-- tomcat 访问期间,只会有一个servlet被实例化--> </servlet> <servlet-mapping> <servlet-name>WYF</servlet-name> <url-pattern>/wyf</url-pattern> </servlet-mapping>
有四种路径配置方法,当路径冲突时,优先级为 具体 > 前置 > 通配 > 后置
<!-- 具体路径请求--> <url-pattern>/wyf</url-pattern> <!-- 前置条件请求--> <url-pattern>/wyf/*</url-pattern> <!-- 后置条件请求--> <url-pattern>*.do</url-pattern> <!-- 通配符请求路径--> <url-pattern>/*</url-pattern>
Response
为了给用户一个返回数据,我们需要使用HttpServletResponse
从相应对象获取一个输入流
通过输入流将返回结果写入到响应体中
关闭输入流
public class ResponseServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String result = "Hello Java"; PrintWriter out = resp.getWriter(); out.println(result); out.close(); } }
中文会乱码
还是因为默认的响应体编码是 ISO的
需要指定编码
resp.setCharacterEncoding("utf-8");
还可以指定ContentType。
resp.setContentType("text/html;charset=utf-8");
Cookie
Cookie ck = new Cookie("key", "value"); resp.addCookie(ck);
读取cookie
Cookie[] cookies = req.getCookies();
不好的是要获取key就只能循环出来,不能单独读取。后续学到了再来做补充。
Session
通过在cookie中存一个session_id来确认用户身份。
session创建方法
HttpSession hs = req.getSession(); HttpSession hs = req.getSession(false); HttpSession hs = req.getSession(true);
getSession() 已有session则返回现有session,否则创建返回
getSession(true) 同上
getSession(false) 已有session则返回现有session,否则返回空
session保存数据
hs.setAttribute("key","value");
hs.getAttribute("key");
设置session的空闲时间
1)Tomcat中配置
<session-config> <session-timeout>1</session-timeout> </session-config>
<!-- 单位分钟 --!>
2)Servlet中配置
hs.setMaxInactiveInterval(120); #单位秒
ServletContext
ServletContext其实就是全局作用域对象, 上下文环境对象
利用context可以实现对,当前网站中所有的Servlet共享数据
context对象只能由Tomcat负责创建,在tomcat启动时创建,关闭时销毁
只能有一个context singleton。
使用
1)从request中获取
ServletContext application = req.getServletContext();
2)context中存放数据
1)在tomcat中存放
<context-param> <param-name>driver</param-name> <param-value>com.mysql.cj.jdbc.Driver</param-value> </context-param>
2) 在servlet中存放
application.setAttribute("name", "silly B");
取
String name = (String) application.getAttribute("name");
注意事项
消耗的是服务器端的内存,所以不要随意往里面放东西。
Post时编码问题
<html> <body> <div> <form action="/Sample01/wyf" method="get"> <label>用户名: </label><input type="text" name="uname"/> <input type="submit" value="get"/> </form> <form action="/Sample01/wyf" method="post"> <label>用户名: </label><input type="text" name="uname"/> <input type="submit" value="post"/> </form> </div> </body> </html>
使用post传参时会发现,tomcat在console的输出会乱码
原因
浏览器采用【get】请求时,请求参数保存在【请求头】,请求头的内容是由tomcat负责的。Tomcat9 编码集默认为 utf-8, 以前也是ISO-8859-1
浏览器采用【post】请求时,请求参数保存在【请求体】,请求体的内容是由请求对象负责的。编码集默认为 ISO-8859-1
解决方法
设置request对象的编码
request.setCharacterEncoding("utf-8");
必须在读取内容前调用该方法.
Tomcat9以前的版本还需要修改Tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
读取复选框的参数
String array[] = req.getParameterValues("hobby");
<form action="/Sample01/cbs" method="get"> <label>爱好: </label><input type="checkbox" name="hobby" value="1">吴亦凡<br> <input type="checkbox" name="hobby" value="2">才徐坤<br> <input type="checkbox" name="hobby" value="3">郭德纲<br> <input type="submit"/> </form>
测试结果
过滤器
创建
1.实现了Filter接口的实现类被认为是一个过滤器
2.重写doFilter方法,来过滤请求
3.webxml中注册过滤器通知tomcat
生命周期
启动时创建,一个过滤器只有一个实例对象,关闭时销毁。
public class myFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String age = servletRequest.getParameter("age"); if(Integer.valueOf(age)<18){ servletResponse.getWriter().println("too young"); }else { filterChain.doFilter(servletRequest, servletResponse); // 继续下一个filter } }
}
web.xml
<filter> <filter-name>firstFilter</filter-name> <filter-class>com.lh.control.myFilter</filter-class> </filter> <filter-mapping> <filter-name>firstFilter</filter-name> <url-pattern>/18x.jpg</url-pattern> //还有通配符 前置 后置的匹配模式 </filter-mapping>
应用:用filter设置编码集。 控制未登录用户访问页面
监听器
servlet中的监听器专门用于监控域对象(request,session,context)
public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { }
@Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
web.xml中注册
<listener> <listener-class>com.lh.control.MyListener</listener-class> </listener>