Servlet
1.什么是javaweb程序?
运行在服务器上java程序就是javaweb程序,通过浏览器访问,例如我常说的网站就是典型的web程序。Web程序属于B/S架构的程序。
2.B/S架构的程序?B/S架构的程序与C/S架构的程序比较?
B/S架构的程序:
B–浏览器 S–服务器 【通过浏览器访问服务器上的程序】【在线的】
与B/S架构相对的就是C/S架构的程序
C–客户端 S–服务器 【通过客户端访问服务器上的程序】【下载的/安装的】
B/S架构的程序与C/S架构的程序比较:
3.Web程序发展过程?
早期Web程序只能通过浏览器访问静态页面【HTML】
随着需求的变化,后来Web程序可以通过浏览器访问动态资源【动态网页】。
静态页面—任何请求访问的页面都是一模一样的,不后有任何变化【标配】
动态网页—随着请求的变化打开不同的页面【不同的用户/不同是时间】【定制】
现在随着用户需求得到变化,我们需要提供不同的资源,以满足所有的用户需求,那么这时我们就要掌握动态网页技术。
4.常见的动态网页技术?
- cgi[通用网关接口]【1、运行慢 2.基于进程的数据交互麻烦】
2.Servlet/jsp-----java
asp--------------C#
php-------------php语法
我们有java基础,所以我们选择学习Servlet/jsp这种动态网页技术。
5.什么是Servlet?
运行在服务器上用来处理用户的请求,做出响应的java程序就是Servlet.
6.常见的web服务器
WEB服务器也称为WWW服务器、HTTP服务器,其主要功能是提供网上信息浏览服务。Unix和Linux平台下常用的服务器有ApacheTomcat、Nginx[负载均衡【分布式】]、IBM WebSphere、WebLogic等,其中应用最广泛的是ApacheTomcat。而Window NT/2000/2003平台下最常用的服务器是微软公司的IIS。
Apache
ApacheTomcat
BM WebSphere
WebLogic
Nginx
微软公司的IIS
我们学习Servlet选择使用ApacheTomcat服务器,因为ApacheTomcat服务器开源免费,它对Servlet/jsp具有完美的支持。
7.ApacheTomcat服务器下载?安装?启动?测试?关闭?
下载ApacheTomcat服务器
http://tomcat.apache.org/
下载好的压缩包
安装ApacheTomcat服务器【apache-tomcat-7.0.96-windows-x64.zip】,在指定目录下解压缩。
启动运行ApacheTomcat服务器,在安装目录中打开bin目录,运行批处理文件,即可运行ApacheTomcat服务器
测试ApacheTomcat服务器,打开浏览器输入http://127.0.0.1:8080
关闭ApacheTomcat服务器,在安装目录中打开bin目录,运行批处理文件,即可关闭ApacheTomcat服务器
ApacheTomcat服务器http请求的默认访问端口是8080,这个端口是可以改变的,下面我们就来改变http请求的访问端口。
在安装目录中打开conf目录/server.xml
保存重新启动,就改变http请求的访问端口。
8.开发一个简单的Servlet程序部署到服务器上运行
基于Eclipse开发一个简单的servlet程序部署并运行
1.创建一个Dynamic Web Project工程
选择运行目标
选择具体的服务器安装目录和jre
一路next,到最后一步选择自动创建web.xml文件
Finish完成
Web工程结构
在src下创建一个包,在这个包中创建一个“TestServlet”类,继承HttpServlet
package com.click369.servlet;
import javax.servlet.http.HttpServlet;
public class TestServlet extends HttpServlet{
}
重写doGet/doPost方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
在doGet方法中调用doPost
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
将需要由servlet处理的请求的具体动作写入doPost方法中
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out=resp.getWriter();
out.println("<html>");
out.println("<head><title>one servlet</title></head>");
out.println("<body>");
out.println("<center>");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String showtime=sdf.format(new Date());
out.println("<font size='10px' color='red'>"+showtime+"</font>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
打开WebContent/WEB-INF/web.xml,配置我们编写好的servlet
<servlet>
<servlet-name>oneservlet</servlet-name>
<servlet-class>com.click369.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>oneservlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
部署Servlet程序到服务器
Window—show view—Servers—点击”…click this link to create a new server”
部署servlet程序【选中需要部署的工程—Add—从左边移动到右边】
Finish–部署程序成功
运行程序【选择自己配置部署好的服务器–右键—start】
访问【http://127.0.0.1:8080/OneServlet/one】
9.Servlet的生命周期?
Servlet的生命周期是从开始创建servlet对象一直到处理客户端请求以后,的整个过程就是Servlet的生命周
1.什么时候创建的Servlet对象
2.如何处理用户的请求
3.处理过用户的请求以后怎么样啦??
2.1servlet在运行的时候是由Servlet容器【服务器】来管理和维护Servlet的运行。不是程序开发者自己去实例化Servlet对象,然后调用方法执行,处理用户请求的。
2.2 Servlet程序的运行过程
例如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>TestServletDemo1</display-name>
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.click369.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet{
/**
* servlet的初始化方法init
* 可以在这个方法中得到数据库对象等等这些操作
* 就是在这个地方去完成一些在处理用户请求之前需要的一些准备工作
* 在请求第一次执行的时候,只被执行了一次。
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet的初始化方法init方法");
}
/**
* Servlet的service方法处理用户的请求并作出响应
* HttpServletRequest---请求对象
* HttpServletResponse---响应对象
* 会被多次执行
*/
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("处理用户请求作出响应的service方法");
}
/**
* servlet对象的销毁方法
* 完成一些在处理用户请求之后需要的一些收尾工作
* 例如:关闭数据库/输出输出流
*/
@Override
public void destroy() {
System.out.println("销毁实例化好的Servlet对象,释放Servlet所占用的内存空间");
}
}
http://127.0.0.1:8080/TestServletDemo2/test
运行结果
10.Servlet中常用的接口,类,方法
1.Servlet接口javax.servlet.Servlet
javax.servlet.Servlet接口
init(ServletConfig)–初始化方法
ServletConfig getServletConfig()–得到Servlet配置对象【web.xml对应的java对象】
void service(javax.servlet.ServletRequest arg0, javax.servlet.ServletResponse arg1)–请求处理
String getServletInfo()–servlet信息【不常用】
void destroy()—销毁servlet对象
例如:
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet implements Servlet{
/**
* servlet的初始化方法
* @param arg0
* @throws ServletException
*/
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("servlet的初始化方法");
}
/**
* servlet的请求处理方法
* @param arg0
* @param arg1
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("servlet的请求处理方法");
}
/**
*servlet的销毁方法
*/
@Override
public void destroy() {
System.out.println("servlet的销毁方法");
}
/**
* 得到servlet的配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 得到servlet基本信息
* @return
*/
@Override
public String getServletInfo() {
return null;
}
}
2.ServletConfig接口javax.servlet.ServletConfig----Servlet配置对象【web.xml对应的java对象】
Strign getServletName()–得到web.xml中配置servlet-name
例如:
ServletConfig conf=this.getServletConfig();
String servletname=conf.getServletName();
String getInitParameter(String)---得到在web.xml文件中配置的初始化参数值
例如:
1.需要在web.xml文件中配置一个/多个初始化参数
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.click369.servlet.TestServlet</servlet-class>
<init-param>
<param-name>myname</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>myaddress</param-name>
<param-value>西安</param-value>
</init-param>
</servlet>
2.通过String getInitParameter(String)—得到在web.xml文件中配置的初始化参数值
//得到ServletConfig对象
ServletConfig conf=this.getServletConfig();
String name=conf.getInitParameter("myname");
String address=conf.getInitParameter("myaddress");
System.out.println(name+" "+address);
ServletContext getServletContext()---得到servlet上下文对象【运行环境】
可以获取当前服务器所支持的Servlet版本号
例如:
ServletConfig conf=this.getServletConfig();
ServletContext context=conf.getServletContext();
int majorVersion=context.getMajorVersion();//主版本号
int MinorVersion=context.getMinorVersion();//次版本号
System.out.println(majorVersion+"."+MinorVersion);
3.HttpServletRequest接口javax.servlet.http.HttpServletRequest【表示一个http请求对象】
1.HttpServletRequest继承了javax.servlet.ServletRequest
void setCharacterEncoding(String)--设置请求对象的字符编码
String getCharacterEncoding()----得到请求对象的字符编码
String getParameter(String)--得到指定请求参数的值
http请求
https://www.baidu.com/s?wd=java&rsv_spt=1&rsv_iqid=0x97ee8915000285fa&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=5&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=915&rsv_sug4=1658
在这个http请求中从“?”开始,后面跟随的都是请求参数,其中java 、0x97ee8915000285fa.....这些都是请求参数值
【RequestDispatcher getRequestDispatcher(String)---设置跳转】
void setAttribute(String, Object)--向请求对象中添加保存数据
void removeAttribute(String)---从请求对象中移除指定的数据。
Object getAttribute(String)--从请求对象中获取指定的数据。
RequestDispatcher req.getRequestDispatcher("")得到一个设置请求跳转的RequestDispatcher 对象
RequestDispatcher 对象的跳转forward(ServletRequest, ServletResponse);
例如:
package com.click369.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;
/**
* 绘制登陆界面Servlet
* @author Administrator
*
*/
public class LoginUIServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out=resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>用户登陆</title></head>");
out.println("<body>");
out.println("<center>");
Object errorObject=req.getAttribute("error");
if(errorObject!=null){
String error=(String)errorObject;
out.println("<font color='red'>"+error+"</font>");
}
out.println("<form action='cheack' method='post'>");
out.println("<table>");
out.println("<tr algin='center'><td colspan='2'>用户登陆</td></tr>");
out.println("<tr algin='center'><td>用户名:</td><td><input type='text' name='username' /></td></tr>");
out.println("<tr algin='center'><td>密码:</td><td><input type='password' name='password' /></td></tr>");
out.println("<tr algin='center'><td colspan='2'><input type='submit' value='登陆' /></td></tr>");
out.println("</table>");
out.println("</form>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
package com.click369.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 检查用户名和密码Servlet
* @author Administrator
*
*/
public class CkeackServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username=req.getParameter("username");
String password=req.getParameter("password");
if("zhangsan".equals(username) && "123456".equals(password)){
req.setAttribute("name", username);
req.getRequestDispatcher("/success").forward(req, resp);
}else{
req.setAttribute("error", "用户名密码错误!");
req.getRequestDispatcher("/login").forward(req, resp);
}
}
}
package com.click369.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;
/**
* 登陆成功Servlet
* @author Administrator
*
*/
public class SuccessServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out=resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>用户首页</title></head>");
out.println("<body>");
out.println("<center>");
Object errorObject=req.getAttribute("name");
if(errorObject==null){
req.getRequestDispatcher("/login").forward(req, resp);
}else{
String name=(String)errorObject;
out.println("<font size='10px' color='red'>"+name+",登陆成功!</font>");
}
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
Web.xml
```java
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>LoginProject</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- LoginUIServlet -->
<servlet>
<servlet-name>loginui</servlet-name>
<servlet-class>com.click369.servlet.LoginUIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginui</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- CkeackServlet -->
<servlet>
<servlet-name>cheack</servlet-name>
<servlet-class>com.click369.servlet.CkeackServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cheack</servlet-name>
<url-pattern>/cheack</url-pattern>
</servlet-mapping>
<!-- SuccessServlet -->
<servlet>
<servlet-name>success</servlet-name>
<servlet-class>com.click369.servlet.SuccessServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>success</servlet-name>
<url-pattern>/success</url-pattern>
</servlet-mapping>
</web-app>
4.HttpServletResponse接口 javax.servlet.http.HttpServletResponse【表示一个http响应对象】
HttpServletResponse接口继承了 javax.servlet.ServletResponse
sendRedirect(String)----设置跳转
setCharacterEncoding(String)—设置响应对象的字符编码```
11.forward与Redirect【resp.sendRedirect(String)】跳转的区别?
1.forward是指通过RequestDispatcher对象调用forward方法完成跳转
通过HttpServletRequest对象调getRequestDispatcher方法就可以得到RequestDispatcher对象
所谓的forward跳转实际上是请求的一次转发,所以forward有时被认为是请求转发,最显著的特征是浏览器地址栏中的地址不会发生变化,因为跳转的时候使用的是同一个请求对象。
跳转的时候可以去掉跳转路径前面的“/”
req.getRequestDispatcher("/tow").forward(req,resp);
req.getRequestDispatcher("tow").forward(req, resp);
2.Redirect指的是通过HttpServletResponse对象调用sendRedirect(String)方法完成跳转
HttpServletResponse对象.sendRedirect(String)
所谓的Redirect跳转实际上是请求的一次重定向,所以Redirect有时被认为是请求重定向,最显著的特征是浏览器地址栏中的地址会发生变化,因为跳转的时候使用的是不在是同一个请求对象。
跳转的时候必须去掉跳转路径前面的“/”
//resp.sendRedirect("/tow"); //错误的
resp.sendRedirect(“tow”);
12.为什么需要会话跟踪?什么是会话跟踪?四种会话跟踪技术?
1.会话跟踪
例如:我们在一个网上商城购买商品时,不同的用户都可以拥有自己的购物车,但是在结算的时候,服务器是怎么样区分不同用户的购物车?
为什么需要“服务器是怎么样区分不同用户的购物车?”?
我们在网上商城购买商品的时候,使用浏览器发送的http请求,使用的是http协议完成请求发送,而http协议是一种无状态的协议,它不会去主动记录使用这个http协议的用户是谁,一旦请求发送成功,服务器做出响应以后,那么此时浏览器与服务器之间的链接就会消失,这时服务器就不知道请求来自哪里,是谁发送来的。所以这时我们就需要记录/保存请求/链接的状态,实现这个记录记录/保存请求/链接的状态的过程就叫会话跟踪。
2.四种会话跟踪技术
URL重写:URL地址重写的原理是将该用户Session的id信息重写到URL地址中,以便在服务器端进行识别不同的用户。URL重写能够在客户端停用cookies或者不支持cookies的时候仍然能够发挥作用。
https://blog.csdn.net/qq_33098039/article/details/78184535?sessionid=123456
将会标识用户的一个编号,跟随在每一个http请求中,用于让服务器认识这个用户。
隐藏表单域:将用户Session的id信息添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示,浏览时看不到,源代码中有。
Cookie:Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。服务器创建保存于浏览器端,不可跨域名性,大小及数量有限。客户端可以采用两种方式来保存这个Cookie对象,一种方式是 保存在 客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。 这样就实现了对客户的跟踪。Cookie是可以被禁止的。
session:每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。保存在服务器端。需要解决多台服务器间共享问题。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。
上面的session过程与我们超市的时候,在超市门口的储物柜中保存物品的过程。
13.Session和Cookie区别?
Session和Cookie区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
应用场景:
记住账号密码一般在cookie中,购物车的实现一般也是cookie。
私人信息及登陆验证信息在session中。
例如:
package com.click369.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;
import javax.servlet.http.HttpSession;
/**
* 用户登陆的Servlet
* @author Administrator
*
*/
public class LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//得到HttpSession对象
HttpSession session=req.getSession();
PrintWriter out=resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>用户登陆</title></head>");
out.println("<body>");
out.println("<center>");
Object errorObject=session.getAttribute("error");
if(errorObject!=null){
out.println("<font size='10px' color='red'>"+(String)errorObject+"</font>");
}
out.println("<form action='cheack' method='post'>");
out.println("<table border='1px'>");
out.println("<tr align='center'><td colspan='2'>用户登陆</td></tr>");
out.println("<tr align='center'><td>用户名:</td><td><input type='text' name='username' /></td></tr>");
out.println("<tr align='center'><td>密码:</td><td><input type='password' name='password' /></td></tr>");
out.println("<tr align='center'><td colspan='2'><input type='submit' value='登陆' /></td></tr>");
//显示session的基本信息
MyUtil.getSessionInfo(out,session);
out.println("</table>");
out.println("</form>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
package com.click369.servlet;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpSession;
/**
* 帮助类
* @author Administrator
*
*/
public class MyUtil {
/**
* 显示session的基本信息
* @param out
* @param session
*/
public static void getSessionInfo(PrintWriter out, HttpSession session) {
//得到sessionID
String sessionID=session.getId();
//得到session对象的创建时间[毫秒]
long time=session.getCreationTime();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strtime=sdf.format(new Date(time));
//得到session的最后访问时间[毫秒]
long lasttime=session.getLastAccessedTime();
String strlasttime=sdf.format(new Date(lasttime));
//得到session的最大不活动时间[秒]
int maxInactivetime=session.getMaxInactiveInterval();
//设置session的最大不活动时间[秒]
//session.setMaxInactiveInterval(arg0);
//是否是一个新的session对象
boolean isNew=session.isNew();
out.println("<tr align='center'><td>sessionID:</td><td>"+sessionID+"</td></tr>");
out.println("<tr align='center'><td>session的创建时间:</td><td>"+strtime+"</td></tr>");
out.println("<tr align='center'><td>session的最后访问时间:</td><td>"+strlasttime+"</td></tr>");
out.println("<tr align='center'><td>session的最大不活动时间:</td><td>"+maxInactivetime+"秒</td></tr>");
out.println("<tr align='center'><td>是否是一个新的session对象:</td><td>"+isNew+"</td></tr>");
}
}
package com.click369.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;
import javax.servlet.http.HttpSession;
/**
* 验证用户名/密码的Servlet
* @author Administrator
*
*/
public class CheackServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//得到登陆的用户名和密码
String name=req.getParameter("username");
String pass=req.getParameter("password");
//判断
if("zhangsan".equals(name) && "123456".equals(pass)){
req.getSession().setAttribute("name", name);
resp.sendRedirect("success");
}else{
req.getSession().setAttribute("error", "用户名密码错误");
resp.sendRedirect("login");
}
}
}
package com.click369.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;
import javax.servlet.http.HttpSession;
/**
* 登陆成功Servlet
* @author Administrator
*
*/
public class SuccessServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//得到HttpSession对象
HttpSession session=req.getSession();
Object nameObject=session.getAttribute("name");
if(nameObject==null){
resp.sendRedirect("login");
}
PrintWriter out=resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>用户首页</title></head>");
out.println("<body>");
out.println("<center>");
out.println("<table border='1px'>");
out.println("<tr align='center'><td colspan='2'>"+(String)nameObject+",登陆成功!!</td></tr>");
out.println("<tr align='center'><td><a href='login'>返回登陆</a></td><td><a href='loginout'>注销退出</a></td></tr>");
//显示session的基本信息
MyUtil.getSessionInfo(out,session);
out.println("</table>");
out.println("</center>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
package com.click369.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;
import javax.servlet.http.HttpSession;
/**
* 注销退出的Servlet
* @author Administrator
*
*/
public class LoginOutServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//销毁session
req.getSession().invalidate();
resp.sendRedirect("login");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>SessionDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- LoginServlet -->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.click369.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- CheackServlet -->
<servlet>
<servlet-name>cheack</servlet-name>
<servlet-class>com.click369.servlet.CheackServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cheack</servlet-name>
<url-pattern>/cheack</url-pattern>
</servlet-mapping>
<!-- SuccessServlet -->
<servlet>
<servlet-name>success</servlet-name>
<servlet-class>com.click369.servlet.SuccessServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>success</servlet-name>
<url-pattern>/success</url-pattern>
</servlet-mapping>
<!-- SuccessServlet -->
<servlet>
<servlet-name>loginout</servlet-name>
<servlet-class>com.click369.servlet.LoginOutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginout</servlet-name>
<url-pattern>/loginout</url-pattern>
</servlet-mapping>
</web-app>
14.HttpSession的常用方法?
4.HttpSession接口
在上面的这个例子中我们通过Redirect从OneServlet跳转到TowServlet的时候无法在TowServlet中得到在OneServlet的这个请求对象中保存的数据。我们如果采用Redirect跳转,那么该如何在两个Servlet中传递数据???
我们可以使用HttpSession接口对象在两个Servlet中传递数据。
HttpSession接口—表示一个会话对象【同一个用户所发出的一系列请求】
通过HttpServletRequest对象调用getSession(),就可以得到HttpSession接口对象。
HttpSession接口对象.setAttribute(arg0, arg1)—将数据保存到HttpSession对象
HttpSession接口对象.getAttribute(String)–从HttpSession对象获取指定的数据
HttpSession接口对象.removeAttribute(arg0);–从HttpSession对象移除指定的数据
例如:
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class OneServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet---doPost");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session=req.getSession();
session.setAttribute("myname", "张三疯");
//req.getSession().setAttribute("myname", "张三疯");
resp.sendRedirect("tow");
}
}
package com.click369.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class TowServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("TowServlet---doPost");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session=req.getSession();
String value=(String)session.getAttribute("myname");
System.out.println("TowServlet==msg=="+value);
}
}
15.Get与Post的区别?
Get和Post在面试中一般都会问到,一般的区别:
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
(2)post发送的数据更大(get有url长度限制)
(3)post能发送更多的数据类型(get只能发送ASCII字符)
(4)post比get慢
(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据
Eclipse开发,打包程序,独立部署到服务器
1.1创建一个Dynamic Web Project工程
1.2在src下创建一个包,在这个包中创建一个“TestServlet”类,继承HttpServlet
1.3重写doGet/doPost方法
1.4在doGet方法中调用doPost
1.5将需要由servlet处理的请求的具体动作写入doPost方法中
1.6打开WebContent/WEB-INF/web.xml,配置我们编写好的servlet
1.7打包程序成为war包
选中工程–右键–export–web–war file
1.8将生成的war包独立部署到服务器
将生成的war包直接赋值到服务器安装目录中的webapps文件夹中就部署完毕。
1.9运行测试
在浏览器的地址栏中输入http://127.0.0.1:8080/TestServlet/test