简约回顾一下学习的 Java web的(长时间没敲过代码了,算是复习一下)(1)

编辑器: 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  到此结束,用了好几个小时呢,由此看出我的基础真的不行。

不过还是希望感觉可以的点个赞,鼓励鼓励我,嘿嘿

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值