1 安装 Tomcat
安装启动Tomcat的学习中,可能会遇到一种情况,即双击bin目录中的startup.bat脚本文件时,命令行窗口一闪而过。在这种情况下,由于无法查看到错误信息,因此,无法对Tomcat进行诊断,分析其出错的原因。这时,可以先启动一个命令行窗口,在这个命令行窗口中进入Tomcat安装目录中的bin目录,然后在该窗口中执行startup.bat命令,就会看到错误信息显示在该窗口中。
2 查看 jdk 路径
cmd:java -verbose
3 修改tomcat端口号
server.xml文件中有一个<Connector>元素,该元素中有一个port属性,这个属性就是用于配置Tomcat服务器监听的端口号。当前port属性的值为8080,表示Tomcat服务器使用的端口号是8080。Tomcat监听的端口号可以是0~65 535的任意一个整数,如果出现端口号被占用的情况,就可以修改这个port属性的值来修改端口号
4 创建tomcat服务器
在 Eclipse 中创建Tomcat服务器。单击Eclipse下侧窗口的【Servers】选项卡标签(如果没有这个选项卡,则可以通过【Window】→【Show View】打开),在该选项卡中可以看到一个“No servers available.Define a new server from the new server wizard…”的链接,单击这个链接,会弹出一个【New Server】窗口
5 修改tomcat端口
修改HTTP/1.1端口9999,tomcat admin port 为8080
6 tomcat项目要右键设置 classpath 属性
ClassPath —->Add Library —-> Server Runtime —-> Next —-> 选择tomcat —-> Finish
7 javac 编译 servlet
把servlet-api.jar文件复制到该源文件夹下,就用了 javac -classpath servlet-api.jar *.java,果然没出错,发现了 class文件 。
8 ecliplse 创建web项目
File -New-Dynamic Web Project
9 tomcat配置servet,可配置为多重URL
<servlet>
<servlet-name>TestServlet01</servlet-name>
<servlet-class>cn.itcast. Servlet .TestServlet01</servlet-class>
</servlet>
<servlet-mapping>
<!–映射为Test01–>
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/Test01</url-pattern>
<url-pattern>/Test11</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestServlet2</servlet-name>
<servlet-class>cn.itcast.servlet.TestServlet2</servlet-class>
</servlet>
<servlet-mapping>
<!–映射为Test01–>
<servlet-name>TestServlet2</servlet-name>
<url-pattern>/Test02</url-pattern>
</servlet-mapping>
其中,<url-pattern>/</url-pattern>,可设置为默认servlet,
10 servletconfig 接口获取servlet初始参数
web.xml中配置init-param作为初始参数
<servlet>
<servlet-name>TestServlet2</servlet-name>
<servlet-class>cn.itcast.servlet.TestServlet2</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
在servlet请求中通过ServletConfig读取
PrintWriter out = response.getWriter();
// 获得ServletConfig对象
ServletConfig config = this.getServletConfig();
// 获得参数名为 encoding 对应的参数值
String param = config.getInitParameter(“encoding”);
out.println(“encoding=”+param);
11 ServletContext接口,该对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享
配置如下:
<context-param>
<param-name>companyName</param-name>
<param-value>itcast</param-value>
</context-param>
<context-param>
<param-name>address</param-name>
<param-value>beijing</param-value>
</context-param>
servlet请求中读取context-param
response.setContentType(“text/html; charset =utf-8″);
// 得到 ServletContext 对象
ServletContext context = this.getServletContext();
// 得到包含所有初始化参数名的Enumeration对象
Enumeration<String> paramNames =context.getInitParameterNames();
out.println(“all the paramName and paramValue are following:”);
// 遍历所有的初始化参数名,得到相应的参数值并打印
while (paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
String value = context.getInitParameter(name);
out.println(name + “: ” + value);
out.println(“<br />”);
}
12 ServletContext对象所存储的数据可以被多个Servlet所共享。
设置属性值:
ServletContext context = this.getServletContext();
// 通过setAttribute()方法设置属性值
context.setAttribute(“data”, “this servlet save data”);
读取属性值:
ServletContext context = this.getServletContext();
// 通过getAttribute()方法获取属性值
String data = (String) context.getAttribute(“data”);
13 读取web应用文件下的资源文件

response.setContentType(“text/html;charset=utf-8”);
ServletContext context = this.getServletContext();
PrintWriter out = response.getWriter();//获取 相对路径 中的输入流对象
InputStream in = context.getResourceAsStream(“/WEB-INF/classes/itcast.properties”);
//获取文件绝对路径12
//String path = context.getRealPath(“/WEB-INF/classes/itcast.properties”);
// FileInputStream in = new FileInputStream(path);
Properties pros = new Properties();
pros.load(in);
out.println(“Company=” + pros.getProperty(“Company”) +”<br />”);
out.println(“Address=” + pros.getProperty(“Address”) + “<br />”);
14 HttpServletResponse对象发送响应消息体相关的方法
虽然 response 对象的 getOutputStream()和 getWriter()方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用
String data = “data”;
//获取字节流输出对象
OutputStream out = response.getOutputStream();
out.write(data.getBytes());
//获取字符流输出对象
PrintWriter print = response.getWriter();
print.write(data);
15 解决中文乱码
第一种方法
response.setContentType(“text/html;charset=utf-8”);
第二种方法
response.setCharacterEncoding(” utf -8″);// 通知浏览器使用utf-8解码
response.set header (“Content-Type”,”text/html;charset=utf-8″);
16 网页跳转和定时刷新
// 2秒后刷新并跳转到 传智播客 官网首页
response.setHeader(“Refresh”,”2;URL=#34;);
// 每隔3秒定时刷新当前页面9
response.setHeader(“Refresh”, “3”);
response.getWriter().println(new java.util.Date());// 输出当前时间
17 HttpServlet request 对象读取消息头
PrintWriter out = response.getWriter();// 获取请求消息中所有头字段
Enumeration headerNames = request.getHeaderNames();// 使用循环遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
while (headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
out.print(headerName + ” : ” + Request .getHeader(headerName) + ” <br />”);
}
18 HttpServletRequest对象读取消息行
PrintWriter out = response.getWriter();// 获取请求行的相关信息11
out.println(“getMethod : ” + request.getMethod() + “<br />”);
out.println(“getRequestURI : ” + request.getRequestURI() +”<br />”);
out.println(“getQueryString:”+request.getQueryString() + “<br />”);
out.println(“get Protocol : ” + request.getProtocol() + “<br />”);
out.println(“getContextPath:”+request.getContextPath() + “<br />”);
out.println(“getPathInfo : ” + request.getPathInfo() + “<br />”);
out.println(“getPathTranslated : “+ request.getPathTranslated() + “<br>”);
out.println(“getServletPath:”+request.getServletPath() + “<br />”);
out.println(“getRemoteAddr : ” + request.getRemoteAddr()+ “<br />”);
out.println(“getRemoteHost : ” + request.getRemoteHost()+ “<br />”);
out.println(“getRemotePort : ” + request.getRemotePort() +”<br />”);
out.println(“getLocalAddr : ” + request.getLocalAddr() + “<br />”);
out.println(“getLocalName : ” + request.getLocalName() + “<br />”);
out.println(“getLocalPort : ” + request.getLocalPort() + “<br />”);
out.println(“getServerName : ” + request.getServerName()+ “<br />”);
out.println(“getServerPort : ” + request.getServerPort() + “<br />”);
out.println(“getScheme : ” + request.getScheme() + “<br />”);
out.println(“getRequestURL : ” + request.getRequestURL() +”<br />”);
19 防止盗链
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
// 获取referer头的值
String referer = request.getHeader(“referer”);
// 获取访问地址13
String sitePart = “#34; + request.getServerName();
// 判断referer头是否为空,这个头的首地址是否以sitePart开始的
if (referer != null && referer.startsWith(sitePart)) {
// 处理正在下载的请求
out.println(“dealing download …”);
}
else {
// 非法下载请求跳转到download.html页面
RequestDispatcher rd = request.getRequestDispatcher(“/download.html”);
rd.forward(request, response);
}
20 HttpServletRequest获取请求参数
String name = request.getParameter(“username”);
String password = request.getParameter(“password”);
System.out.println(“用户名:” + name);
System.out.println(“密 码:” + password);// 获取参数名为“hobby”的值
String[] hobbys = request.getParameterValues(“hobby”);
System.out.print(“爱好:”);
for (int i = 0; i < hobbys.length; i++) {
System.out.print(hobbys[i] + “, “);
}
21 HttpServletRequest防止请求参数出现乱码
request.setCharacterEncoding(“utf-8”);
22 RequestDispatcher对象请求转发
1.将当前servlet请求中,数据存储到request对象中
request.setAttribute(“company”, ” 北京传智播客教育科技有限公司 “);
RequestDispatcher dispatcher = request.getRequestDispatcher(“/ResultServlet”);
dispatcher.forward(request, response);
2.转发servlet请求中,读取了请求的属性company并显示,并且页面不需发生跳转。
response.setContentType(“text/html;charset=utf-8”);
// 获取PrintWriter对象用于输出信息
PrintWriter out = response.getWriter();
// 获取request请求对象中保存的数据
String company = (String)request.getAttribute(“company”);
if (company != null)
{
out.println(“公司名称:” + company + “<br>”);
}
23 请求包含
请求包含指的是使用 include ()方法将Servlet请求转发给其他Web资源进行处理,与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息。使用include()方法实现请求包含后,浏览器显示的URL地址是不会发生变化的。
当前servlet:
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
RequestDispatcher rd = request.getRequestDispatcher(“/IncludedServlet?p1=abc”);
out.println(“before including” + “<br />”);
rd.include(request, response);
out.println(“after including” + “<br />”);
包含servlet:
response.setContentType(“text/html;charset=utf-8”);
response.setCharacterEncoding(“utf-8”);
PrintWriter out = response.getWriter();
out.println(“中国” + “<br />”);
out.println(“URI:” + request.getRequestURI() + “<br />”);
out.println(” Query String:” + request.getQueryString() + “<br />”);
out.println(“parameter p1:” +request.getParameter(“p1”) + “<br />”);
24 操作 cookie
String lastAccessTime = null;
// 获取所有的cookie,并将这些 Cookie 存放在数组中
Cookie[] Cookies = request.getCookies();
// 遍历cookies数组
for (int i = 0; cookies != null && i < cookies.length; i++) {
if (“lastAccess”.equals(cookies[i].getName())) {
// 如果cookie的名称为lastAccess,则获取该cookie的值
lastAccessTime = cookies[i].getValue();
break;
}
}
// 判断是否存在名称为lastAccess的cookie
if (lastAccessTime == null) {
response.getWriter().print(“您是首次访问本站!!!”);
}
else {
response.getWriter().print(“您上次的访问时间是: ” + lastAccessTime);
}
// 创建cookie,将当前时间作为cookie的值发送给客户端
String currentTime = new SimpleDateFormat(“yyyy年MM月dd日hh:mm:ss”).format(new Date());
Cookie cookie = new Cookie(“lastAccess”, current Time);
// 发送 cookie
response.addCookie(cookie);
25 操作 session
读取session
//创建或者获取保存用户信息的session对象
HttpSession session = request.getSession();
User user = (User) session.getAttribute(“user”);
存储session
cart = new ArrayList<Book>();
//将购物车存入session对象
session.setAttribute(“cart”, cart);