一、上课时学习了怎么编写第一个servlet
//需求:服务器向客户端输出 Hello,Servlet!!! //总共分三步 //1.导包 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; //2.继承HttpServlet 抽象类 重写doGet() 和doPost(); public class HelloServlet extends HttpServlet{ @Override public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ PrintWriter out = response.getWriter(); out.println("Hello,Servlet!!!"); out.flush(); out.close(); } @Override public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ this.doGet(request, response); } } //3.在web.xml配置Servlet //servlet配置如下 <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>com.servlet.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern> </servlet-mapping>
其中第三步是在web.xml文件中配置,并不是在java的文件中
不过在servlet3中可以在java文件中,直接使用@注释配置xml文件,但是要遵守以下的版本规范:
1.创建工程时需要时javaEE6的规范
2.jsp版本要在JSP2.2以上
3.Tomcat要使用7.0以上版本(包括7.0)
以下是使用@注释配置文件的示范代码,其中urlpatterns可以有多个值,代表可servlet可以连接多个网页
@WebServlet(name="HelloServlet",urlPatterns={"/aaa","/bbb"}) public class HelloServlet extends HttpServlet { }
二、学习了怎么发布使用tomcat
简单知识点:tomcat两种模式之间的差异:
1.running模式(运行模式)
2.debug模式(调试模式)
区别1:
Running模式不能进行断点调试,debug模式 可以进行断点调试
区别2:
Running模式servlet类变了以后 只会从新部署、不会从新加载类
三、明白服务器和客户端之间的中文乱码问题的出现原因和解决方法
1.服务器向客户端输出中文的时候乱码
是因为服务器输出时默认的编码方式是 ISO-8859-1 ,所以要在服务器中提示客户端用utf-8或是gbk的方式进行解码
具体的解决办法是在servlet中的doGet和doPost方法中的第一行加上:
response.setContentType("text/html;charset=utf-8");
或是将代码中的utf-8改为gbk,但要维持服务器代码和客户端代码编码的一致性
2.客户端向服务器发送数据的时候服务器接收的数据是乱码
客户端传输数据的时候编码方式默认和页面文件的编码方式是一致的,页面编码方式由Jsp页面的contentType="text/html; charset=utf-8"决定的
绝提的解决办法是:
request.setCharacterEncoding("utf-8");
但是:tomcat使用utf-8解码客户端传过来的数据只对post请求有效
四、架构理论知识和一些实践及一些问题的模拟
1.讲解了servlet的起源,以及javaEE的两种开发模型model1和model2
2.介绍讲解了MVC设计模式、三层架构等
3.servlet多线程安全问题
解决方法的演示:
1.实现SingleThreadModel
public class UnSafeServlet extends HttpServlet implements SingleThreadModel { }
这时候对于一个新的客户端请求,tomcat会为其创建一个新的Servlet对象为它服务,所以不会出现多线程安全问题。
但是不推荐,因为100W个用户同时访问 ,就会创建了100W个对象,会使得内存溢出
2.同步代码块
但是不推荐,速度太慢,一个Servlet执行完才能执行另外一个。
3.在Servlet中写实例变量
4.使用线程局部变量
package com.servlet; //一.导包 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; //二.继承HttpServlet这个抽象类 重写doGet()和doPost public class HelloServlet extends HttpServlet { private int i = 0; private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); static{ System.out.println("HelloServlet被加载"); } public HelloServlet(){ System.out.println("HelloServlet对象被创建"); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter pw = response.getWriter(); System.out.println("bbb"); i++; threadLocal.set(i); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } pw.println(threadLocal.get()); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { this.doGet(request, response); } }