简单理解一些知识点:
1 Servlet的概念
---在server上运行的用于处理client请求和响应的Java程序
2 Servelt的配置3步
----在web.xml中配置mapping( Servelt名字和对应的Servelt类)
----html在页面中调Servelt
----声明自己定义的Servlet类,需要继承HttpServlet类。
3 cookie实际是保持在client上的name-value对,有过期时间,可以保存一些需要的数据供后续server端使用。需要注意的是getCookies返回的是数组。addCookie隐含有update操作。
4 filter过滤器,可以定义对某些url执行一些顺序的操作,调用顺序和mapping顺序一致。
5 session跟踪,主要是为了解决同一用户在server的不同page上切换发送响应时,避免重复验证用户id的操作。
6 page页面上表单作为参数传递到servlet上主要是用request.getParameter和request.getParameters方法。
其他概念:
1 doGet、doPost、doPut、doDelete方法
doGet一般是执行查询,url中会有变量的信息,比较不安全。
doPost一般会有update操作,url中不会有变量的信息,比较安全。
2 HttpServletRequest 客户端请求对象
----实质相当于是上行接受客户端消息的一些参数
3 HttpServletResponse 服务端响应对象
----实质相当于是下行响应发送给客户端消息的一些参数
4 最基本的使用servlet,不适用JSP、struts等高级框架,实质上是把servelt作为MVC中的controller来做的。
5 init方法是给容器(比如Tomcat)调用的,只在servlet使用web.xml创建完毕后,执行前调用一次。
可以自定义重写servlet的init、service、destroy方法,实现一些定制需求。因为写servlet的时候都要继承httpServlet,所以也会继承这几个方法,容器也会调用这几个方法实现。
6 http协议的状态码:
400-499:客户端的错误
500-599:服务端的错误
503:service unavailable服务不可用,server端没有响应,可能是服务端一直再计算,没有给出响应,也可能是其他原因响应超时。
零碎的问题解决:
1 tomcat的dubug模式出现path not found 主要参考stackoverflow的解决方法,修改完要重启eclipse。
http://stackoverflow.com/questions/6174550/eclipse-java-debugging-source-not-found
2 url地址对应的项目文件 /项目名/文件名,或者是web.xml中配置的url和servlet的对于关系,截图:
3 乱码问题参考我之前的文件,添加字符编码的说明即可解决:
具体例子:
1 通过表单获取前台数据,包含从web.xml中获取初始化的一些变量:
<?xml version="1.0" encoding="gb2312"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<!-- 1 servlet和class的映射 -->
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.hj.servlet.TestServlet</servlet-class>
<!-- 2 传参数 -->
<init-param>
<param-name>msg</param-name>
<param-value>welcome you</param-value>
</init-param>
</servlet>
<!-- 3 servlet和url的映射 -->
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</web-app>
<!-- 1 解决乱码问题 -->
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/HTML; charset=gbk">
<title>Welcome you!</title>
</head>
<body>
<!-- 2 action名对应servlet名 例子中用的是post则对应servlet中的doPost方法 -->
<!-- 3 input中的name对应于serlve中直接通过名称提取变量 -->
<form action="TestServlet" method="post">
user name: <input type="text" name="user"><p>
<input type="submit" value="提交">
</form>
</body>
</html>
package com.hj.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
req.setCharacterEncoding("gb2312");
//1 通过表单的name获取表单的变量名
//2 如果要表单的所有变量可以用getParameters返回数组类型,具体参考api
String user=req.getParameter("user");
//3 getInitParameter获取web.xml中配置的变量
String welcomeMsg=getInitParameter("msg");
resp.setContentType("text/html;charset=gb2312");
PrintWriter out=resp.getWriter();
//4 直接返回html给client
out.println("<html><head><title>");
out.println("Welcome Page");
out.println("</title><body>");
//5 变量的调用
out.println(welcomeMsg+", "+user);
out.println("</body></head></html>");
out.close();
}
//6 由于在JSP中调用的post所以会调用这个方法,doGet也在这里
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
doGet(req,resp);
}
}
目录结构:
对应url
http://localhost:8080/TestServletJsp/index.jsp
2 cookie的读写操作:
public class CookieTest extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
for(int i=0; i<3; i++)
{
// 1 Max-Age过期时间单位是秒,Age为0表示过期 过期后cookie将被删除
// 1.1 默认的过期时间是-1,
// 1.2 负的表示仅限当前browser browser关闭则过期
Cookie cookie = new Cookie("Session-Cookie-" + i,//cookie的name,value对
"Cookie-Value-S" + i);
//
response.addCookie(cookie);
cookie = new Cookie("Persistent-Cookie-" + i,
"Cookie-Value-P" + i);
// Cookie is valid for an hour, regardless of whether
// user quits browser, reboots computer, or whatever.
cookie.setMaxAge(3600);
response.addCookie(cookie);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
String title = "Active Cookies";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
" <TH>Cookie Name\n" +
" <TH>Cookie Value");
Cookie[] cookies = request.getCookies();
if (cookies == null)
{
out.println("<TR><TH COLSPAN=2>No cookies");
}
else
{
for(Cookie cookie: cookies)
{
out.println
("<TR>\n" +
" <TD>" + cookie.getName() + "\n" +
" <TD>" + cookie.getValue());
}
}
out.println("</TABLE></BODY></HTML>");
}
}
5 session跟踪:
6重写init、service、destroy:
package com.hj.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class testInit extends HttpServlet
{
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public testInit() {
super();
}
//1 重写 init方法
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
//1.1 调用父类HttpServlet的方法
super.init(config);
//1.2 自己添加的方法
System.out.println("init方法被执行");
System.out.println("相关的初始化参数:");
//1.3 获取config的信息
System.out.println(config.getInitParameter("info"));
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter printWriter = response.getWriter();
printWriter.write("Hello world");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
super.service(arg0, arg1);
System.out.println("service方法被执行");
}
@Override
public void destroy() {
super.destroy();
System.out.println("destroy方法被执行");
}
}
主要参考:
Servlet教程各种方法的api和例子都有介绍
《Servlet与JSP核心编程(第2版)》