编辑器: eclipse;
tomcat: 9.0;
创建简单web项目 如下:
创建一个servlet 包, 建一个servlet如下:
会生成一下代码:
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class demoServlet
*/
@WebServlet("/demoServlet")
public class demoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public demoServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
首先代码详解 (自己的理解也不算详解):
@WebServlet("/demoServlet") : 这一句 是为了url 访问到的路径 如 这个servlet 我可以用 http://localhost:8080/recognition/demoServlet 访问到。 recognition 是我的项目名称。 即这句话是为url 映射,通过url访问。
这是一个注解的方式 。 还有一种是 web.xml 里面配置。
web.xml的url 映射为:
<servlet>
<servlet-name>demoServlet</servlet-name>
<servlet-class>servlet.demoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demoServlet</url-pattern>
</servlet-mapping>
web.xml 中注册servlet的注意事项:
<servlet> 这个标签在<web-app>下。
在web.xml 中的注册servlet都是这样的格式。 注意 servlet-class 的内容。必须是servlet完整的类名。哪个包下的哪个sevlet
还有 <servlet> 和<servlet-mapping>下的子标签<servlet-name> 必须相同
还有<url-pattern> 中 斜杠必须加不然会下面截图那样的错误,@webservlet 中 斜杠也必须加。
都是为了url映射,两者只能取其一使用,不能同时使用否则 启动服务器时报如下错误:
和如上:是url映射问题的复习
大家新建servlet 时,一定会发现 你新建的类 自动继承了 httpServlet类。
如下是httpServlet 类中的字段
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
private static final String METHOD_TRACE = "TRACE";
private static final String HEADER_IFMODSINCE = "If-Modified-Since";
private static final String HEADER_LASTMOD = "Last-Modified";
private static final String LSTRING_FILE =
"javax.servlet.http.LocalStrings";
private static ResourceBundle lStrings =
ResourceBundle.getBundle(LSTRING_FILE);
前几个 METHOD 为前缀的字段,都是 请求方法的名字。 什么get了,post了。 httpServlet类中也有对应处理的方法。
这里不讲太多,因为我知道的也就这些(嘿嘿)。 有兴趣的同学可以看看。毕竟我这篇文章也只是让刚学servlet的新手了解了解,也不敢称学习学习,不误人子弟。
下面就是doGet 方法。 里面有2个参数 一个httpServletRequest 和 httpServletResponse .这两个可以这样理解,(简单明了)
就好比前者是 请求输入,后者是 输出结果。 而你这个方法,就是为了加工处理,
就好比一个计算器, 你输入数据, 计算器计算完会给你一个结果。 ,httpServletRequest就是为了输入数据而存在,
response 就是为了输出结果而存在,doGet方法里面的代码就是计算过程。 (形容的不是很恰当,当然也有些以偏概全了。新手暂时可以这样理解,毕竟我也是个新手)
再下面就是这句代码
response.getWriter().append("Served at: ").append(request.getContextPath());
首先,response.getWriter() . 返回的是一个 PrintWriter 对象
熟悉java IO基础的同学应该知道
这个printWriter 只是一个处理流, 怎么渲染到页面上去的呢?
想了解这个问题。你先明白
Http 的请求报文格式为:
方法名空格路径空格版本号
请求头名:值
~
~
~
空行
请求正文
如:
GET /1.html HTTP/1.1
Host:localhost:8080
………
Usename=admin&password=123456 //这个是携带的请求参数
Http 的响应报文格式为:
协议版本空格状态码空格状态消息
响应报头:值
……
空行
响应正文
如:
HTTP/1.1 200 OK
Date:Tue,16 May 2017 07:23:05 GMT
Content-Length:97
Content-Type:text/html;charset=UTF-8
Last-Modifield:Tue, 16 May 2017 04:14:19 GMT
<html>
<head>
<title>HttpServer</title>
</head>
<body>
Hello world
</body>
</html>
然后用IE浏览器访问 http://localhost:8080/recognition/demoServlet 然后 F12 点击顶部栏中的网络,然后查看
这时你会看到响应正文 没有东西,这是因为 你没有指定响应格式,即返回数据格式。所以浏览器会把你printWriter输出的东西 都原封不动的给你显示。
//response.setContentType("text/html; charset=utf-8");
//response.setContentType("text/plain; charset=utf-8");
response.getWriter().append("Served at: ").append(request.getContextPath());
在刚开始的代码中不妨加入 我上面注释的代码。 首先第一个,text/html 会返回一个html格式的正文。第二个 text/plain 会返回普通的文本格式正文,它两者的区别在于,是否能识别html 标签了。
用第一个时,返回的截图是这样的
第二个 和第一个差不多, 只是那个画红圈的地方不一样,这里便不截图了,
如果要看到区别便改变response.getWriter().append("Served at: ").append(request.getContextPath()); 这句代码,
替换为
PrintWriter out = response.getWriter();
out.println("<table>");
out.println("<tr><td>工号</td><td>姓名</td><td>年龄</td></tr>");
out.print("<tr>");
out.print("<td>");
out.print("1");
out.println("</td>");
out.print("<td>");
out.print("2");
out.println("</td>");
out.print("<td>");
out.print("3");
out.println("</td>");
out.print("</tr>");
out.println("<table>");
这时就能看出text/plain 和text/html的区别了。
如上
可以看出与浏览器有关。 是浏览器帮你渲染,根据你的指令,帮你渲染成你想要的格式。当然 不止这两种格式,还有json等等,不一一列举。
至于doPost方法,调用的是doGet方法,这是因为,请求的方法有很多种,但是最主要的还是get 和post ,
这样就保证了不管你请求方法是get 还是 post 都是执行一样的代码。
当然你也可以让他们请求方法不同,执行代码不同。这个根据需要。(这时就不用doPost方法调用doGet方法了)
到此 这个新建的servlet 到此结束,用了好几个小时呢,由此看出我的基础真的不行。
不过还是希望感觉可以的点个赞,鼓励鼓励我,嘿嘿