1 Servlet 简绍

  Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

  Servlet的架构图如下所示:

  Servlet特点:

  • Servlet运行于服务端。
  • Servelet没有main方法。 
  • Servlet的创建,销毁由Servlet容器管理,如Tomcat,Jetty等。

2 使用Eclipse新建一个Servlet小程序

  使用Eclipse新建一个Servlet小程序, HelloServlet。

生成一个HelloServlet.java,如下图所示:

新建 HelloServlet.java

package com.bank.study.controller;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletConfig;
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 HelloServlet extends HttpServlet { @Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setCharacterEncoding("utf-8");
response.addHeader("Content-type", "text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println("你好 ,Servlet ....");
pw.flush();
pw.close();
pw = null; } @Override
public void destroy()
{
System.out.println("===== serlet destory() ====== ");
super.destroy();
} @Override
public void init() throws ServletException
{
System.out.println("===== serlet init() ====== ");
super.init();
} @Override
public void init(ServletConfig config) throws ServletException
{
System.out.println("===== serlet init(config) ====== ");
String name = config.getInitParameter("name");
System.out.println("name=" + name);
super.init(config);
} }

  在web.xml新建如下内容:

<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.bank.study.controller.HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>lisi</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>

  然后访问这个Servlet,加入Web工程名为DynaWeb,这个Servlet的访问地址为:

http://127.0.0.1:8888/DynaWeb/HelloServlet

  注意:确认下 Eclipse使用的JDK ,是否和本机安装JDK一致,如果不一致,即使web.xml 配置正常了,也无法正常显示Servlet。

   查看打印消息,参考  Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试 , 配置Tomcat的用户权限。

  然后访问这个Servlet,如果一切正常如下图所示:

    没有打印出Servlet的destory() 方法,进行下一步实验,从Tomcat管理控制平台,移除这个应用。如下图所示:

  然后再查看Tomcat console打印信息,是否打印出這个Servlet的destory方法里的调试信息。  

  url-partten中的路径也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

第一种: *.扩展名

  把 web.xml配置映射路径改为如下:

<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.bank.study.controller.HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>lisi</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

  那么以下地址都是合法的:

http://localhost/studyweb/abc/hello.action
http://localhost/studyweb/aaa.action

第二种: 以正斜杠(/)开头并以“/*”结尾。

把 web.xml配置映射路径改为如下:

<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.bank.study.controller.HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>lisi</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>

那么以下地址都是合法的:

http://localhost/studyweb/hello
http://localhost/studyweb/hello/1
http://localhost/studyweb/hello/1/2/3

3 Tomcat服务器的执行流程

  Tomcat服务器的执行流程

第一次执行:

  • 客户端通过电脑连接服务器,因为是请求是动态的,所以所有的请求交给WEB容器来处理
  • 在容器中找到需要执行的*.jsp文件
  • 之后*.jsp文件通过转换变为*.java文件
  • *.java文件经过编译后,形成*.class文件
  • 最终服务器要执行形成的*.class文件

第二次执行:

  • 因为已经存在了*.class文件,所以不在需要转换和编译的过程

修改后执行:

  • 源文件已经被修改过了,所以需要重新转换,重新编译。

4 Servlet输出中文乱码

1 新建一个Servlet, MainServlet.java

package com.bank.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public MainServlet() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.addHeader("Content-type", "text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");; PrintWriter pw = response.getWriter();
pw.println("<h1>你好</h1>" + new Date() +"中文乱码111");
pw.close();
pw = null; } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

  注意 response.setCharacter() ,response.addHeader() 要告知浏览器的编码方式,返回的响应信息是 html网页格式。

2 web.xml

<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>com.bank.controller.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

3 然后访问这个MainServlet,查看页面是否显示正常。

参考资料: JavaWeb学习总结-07 Filter 学习和使用

5 Servlet获得表单数据

1 新建 form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Insert title here</title>
</head>
<body> <form method="post" action="/studyweb/GetFormServlet">
用户名:<input type="text" name="username" maxlength=""/> <br />
密码:<input type="password" name="pwd" /> <br />
性别: <input type="radio" name="gender" value="male"/>男 &nbsp;&nbsp;
<input type="radio" name="gender" value="female" checked />女 <br/>
爱好:<input type="checkbox" name="interest" value="football" />足球
<input type="checkbox" name="interest" value="basketball" />篮球
<br>
城市: <select name="city">
<option value="beijing">北京</option>
<option value="xian" selected >西安</option>
</select>
<br /> 简绍:<textarea name="desc" rows="" cols="" ></textarea> <br />
<input type="submit" value="提交表单内容" />
<input type="reset" />
<button onclick="alert('click the button')" >点击按钮</button>
</form> </body>
</html>

2 新建 GetFormServlet.java

GetFormServlet的参考代码

package com.bank.study.controller;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class GetFormServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("--- doPost --- ");
//设置请求的字符集为utf-8
request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username");
System.out.println("username=" + username); String password = request.getParameter("pwd");
System.out.println("password=" + password); String gender = request.getParameter("gender");
System.out.println("gender=" + gender); String[] interests = request.getParameterValues("interest");
System.out.println("interests=" + interests);
StringBuffer selInterest = new StringBuffer();
if(null != interests){
for(int i=, j= interests.length;i < j ;i++){
selInterest.append(interests[i]); if( i < j - ){
selInterest.append(",");
}
}
} String city = request.getParameter("city");
System.out.println("city=" + city); String desc = request.getParameter("desc");
System.out.println("desc=" + desc); //设置响应的字符集为utf-8
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter();
out.println("获得以下的参数值");
out.println("username=" + username);
out.println("<br/>"); out.println("password=" + password);
out.println("<br/>"); out.println("gender=" + gender);
out.println("<br/>"); out.println("selInterest=" + selInterest);
out.println("<br/>"); out.println("city=" + city);
out.println("<br/>"); out.println("desc=" + desc);
out.println("<br/>");
String path = request.getContextPath();
out.println("<a href='" + path + "/form.html'>返回表单</a>");
out.flush();
out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response); } }

3 web.xml

  <servlet>
<servlet-name>GetFormServlet</servlet-name>
<servlet-class>com.bank.study.controller.GetFormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetFormServlet</servlet-name>
<url-pattern>/GetFormServlet</url-pattern>
</servlet-mapping>

JSP 学习总结 03 核心组件 Servlet的更多相关文章

  1. jsp学习--如何定位错误和JSP和Servlet的比较

    一.如何查找JSP页面中的错误  JSP页面中的JSP语法格式有问题,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息.JSP页面中的JS ...

  2. 《Servlet和jsp学习指南》 笔记1

    chapter 1 Servlet 4个java 包: 对于每一个http请求,Servlet请求都会创建一个ServletRequest实例,并将它传给Servlet的service方法.Servl ...

  3. JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系

    JSP(JAVA SERVER PAGE)的缩写,其本身就是servlet的简化,是一种动态网页标准,其特点是在HTML代码中嵌入JAVA代码,JSP标签或用户标签来生成网页.至于它为什么会出现,主要 ...

  4. Servlet和JSP学习总结

    目录 Jsp会被编译成servlet,在页面被第一次访问的时候 Jsp中可以在html页面中嵌入java代码或者引入jsp标签 可以在html中引入自定义标签 Web工程的目录结构 Jsp的注释 Js ...

  5. 常见指令与功能介绍-java之JSP学习第二天(非原创)

    文章大纲 一.JSP 指令二.JSP 动作元素三.JSP 隐式对象四.JSP 客户端请求五.JSP 服务器响应六.JSP HTTP 状态码七.JSP 表单处理八.JSP 过滤器九.JSP Cookie ...

  6. JSP学习笔记

    JSP学习笔记 Jsp网页主要分为Elements与Template Data两部分. Template Data:JSP Container不处理的部分,例如HTML内容 Elements:必须经由 ...

  7. jsp学习--基本语法和基础知识

    一.JSP简单介绍 1.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于 ...

  8. JSP 学习二

    在基于昨天对JSP学习的基础上,今天我们来学习JSP的指令和JSP 对中文的处理. 一.JSP指令简介 JSP 指令是为JSP引擎而设计,它并不直接产生任何可见的输出,而只是告诉引擎如何处理JSP页面 ...

  9. JSP 学习一

    今天开始JSP的学习,作为Web开发人员,对JSP的开发是必不可少的,因此有必要对JSP进行掌握和学习:为此开始JSP的学习: 今日目标: 1)什么是JSP? 2)JSP的运行机制? 3)JSP的三种 ...

随机推荐

  1. angr进阶(5)内存操作

    angr也可以将符号写在内存里,控制内存中的值,结合任意位置开始有奇效,但就是慢sym-write p = angr.Project('./issue', load_options={"au ...

  2. JAVA_接口_默认方法&静态方法

    1.小结(注意): 1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰 2.接口中,没有构造方法,不能创建对象 3.接口中,没有静态代码块 ...

  3. 开源前端脚本错误监控及跟踪解决项目BadJS试用

    摘要: 试用BadJS. 原文:开源前端脚本错误监控及跟踪解决项目-BadJS 试用 作者:过错 Fundebug经授权转载,版权归原作者所有. BadJS 是 一个web 前端脚本错误监控及跟踪项目 ...

  4. HTML的概念和三大基石以及标准文档结构

    HTML的概念: 概念:  HTML:超文本标记语言 作用:  需要将java在后台根据用户请求处理的请求结果在浏览器中显示给用户.  在浏览器中数据需要使用友好的格式展示给用户.  HTML是告诉浏 ...

  5. win10更新系统后,无法远程访问的bug

    win10更新系统后,无法远程访问其它电脑(服务器),同时关于其它的远程服务也将无法使用(打印机……) 是因为win10自动更新的时候安装了KB4103718插件 解决办法: 1.手动卸掉KB4103 ...

  6. Android为TV端助力 反编译

    http://blog.csdn.net/vipzjyno1/article/details/21039349/ apktool.bat d -f  test.apk  test     这条命令修改 ...

  7. Android开发,关于如何在应用间共享SharedPreference

    开发一个应用,需要用到两个应用A和B之间共享数据的问题,这个数据是个单一的数据,所以就想用SharedPrefernce来进行保存. 使用网上的各种应用间的共享代码,B是读取A的数据,所以代码为: C ...

  8. docker与虚拟机有何不同

    docker与虚拟机有何不同 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 容器技术有 ...

  9. 安装MySQL8.0 遇到的3个小错误

    过去公司都是用的5.7 系列的MySQL,随着8.0的发版,也想试着升级一下.遇到了两个小错误,记录在此. 路径设置: 安装包路径:/data/mysql80/ 数据路径: /data/mysql/ ...

  10. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...