1.设置编码
在xml文件配置中,一个servlet可以对应多个mapping,意义在于,可以看到用户是采用何种路径访问
一个mapping 只能对应一个servlet
tomcat8之前:
(1.如果是post传递方法:
request.setCharacterEncoding("UTF-8");
(2.如果是get传递方法
1.先将数据转换成字节数组
String name = request.getParameter("name");
byte[] by = name.getBytes("ISO-8859-1");
2.将字节数组按照设定的编码格式转成成字符串
name = new String(by,"UTF-8");
tomcat8之后:
只针对post方法:request.setCharacterEncoding("UTF-8");
2.servlet的生命周期
服务器的开启到服务器的关闭
默认情况下:
第一次接受请求时,servlet会进行初始化(init()),实例化(servce())
而后每次刷新关闭网页等操作都是在调用servce()服务方法
直到服务器的关闭,servlet的生命周期结束,销毁方法(destory())
第一次请求时,tomcat会进行实例化,初始化,然后在服务,而后每次服务都是这个实例对象在执行
** 优点**:
只创建一次对象,提高效率,减少服务器负担
** 缺点**:
第一次服务时,耗时较长
-如果需要提高系统的启动速度,当前默认状态就可以,
-如果要提高servlet的响应速度,应该设置servlet的响应时机。
设置servlet的响应时机:
** 在xml中的servlet中设置<load-on-startup>1</load-on-startup>设置初始化和实例化的时间
时间越小,初始化和实例化的时间就越早,**
采用此标签,初始化和实例化都是在tomcat启动时执行
当第一个用户访问时,就会直接服务不会在进行初始化和实例化,启动速度变慢,但服务响应速度变快,提高用户体验
Servlet在服务器中:单例的,线程不安全的
单例:只有一个servlet实例
线程不安全:当多个线程访问,如果一个线程修改了servlet中的一个变量,可能会导致其他线程的逻辑路径发生变化
因此,在servlet类中不要定义与逻辑有关的变量,并且不要修改变量
3.servlet的继承关系
HttpServlet抽象类 继称 ——> javax.servlet.GenericServlet抽象类 实现 ——> Servlet接口
1.Servlet接口中的三个抽象方法
init(ServletConfig var1);初始化方法
void service(ServletRequest var1, ServletResponse var2);服务方法
void destroy();销毁方法
2. javax.servlet.GenericServlet抽象类中的方法实现了了Servlet中的三个抽象方法,但任然是抽象的方法
3.HttpServlet抽象类中的实现了接口中的方法;
404:出错未找到相应的页面
405:method的方式默认为doget,如果继承HttpServlet却重写的方法不对,就会报错405,method亲求方式出错
500:服务器内部错误
200:正常响应
302:重定向
4.Http协议
http协议:超文本传输协议
http是无状态的
http包括请求和响应
1.请求:包括1).请求行 2).请求头 3).请求体
1).请求行:
1,请求方法
2.请求的url
3.请求的协议:(一般为http1.1)
2).请求头:
包括客户端想服务器发送的浏览器版本,端口号,请求内容等等
3).请求体:
1).get方式:没有请求体 有queryString
2).post方式:有请求体 form data
3).json方式:request payload
2.响应:
1).响应行
包括:协议,响应码(200),响应状态
2).响应头
包括:服务器的信息(版本信息,),响应内容的大小,格式,等
3).响应体
具体响应的内容及具体的页面信息。
5.会话
http是无状态的:
是指服务器无法区分请求是否来自于同一个客户端
无状态导致:可能会发生混乱,服务器将A客户端发来的请求响应到B客户端
解决http无状态的方法:会话跟踪
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
HttpSession id = req.getSession();
System.out.println("创建的session id为:"+id);
}
-服务器在客户端请求时,会给客户端分配会话ID,sessionId,每一个客户端的id唯一,并将创建的id返回给客户端
-客户端下次访问服务器时,就会通过sessionId将响应的结果返回给响应的客户端,以此就解决了混乱问题。
session保存作用域:
不同session之间不可以互相访问其他session保存的内容
session的作用域:**从session创建到浏览器关闭。**
6.服务器内部转发和重定向
1.服务器内部转发:
//测试内部请求转发
public class DemoServlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo02....");
}
}
public class DemoServlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo01....");
//demo01跳转到demo02
requuest.getRequestDispatcher("demo02").forward(requuest,response);
}
}
2.客户端重定向:
public class DemoServlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo01....");
//测试内部请求转发
// requuest.getRequestDispatcher("demo02").forward(requuest,response);
//测试重定向
response.sendRedirect("demo02");
}
}
public class DemoServlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo02....");
}
}
版权归原作者 余扯 所有, 如有侵权,请联系我们删除。