-
Servlet就是sun公司开发动态web的一门技术
-
sun在这些API中提供了一个接口叫做:Servlet,如果你想要开发一个Servlet程序,只需要两步:
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web服务器中
-
把实现了Servlet接口的java程序叫做Servlet
-
servlet接口在sun公司有两个实现类: HttpServlet,GenericServlet
-
构建一个普通的Maven项目,删掉里面的src目录,以后我们学习就在这个项目里面建立Moudel;这个空的工程就是Maven的主公程。
-
建立一个Moudel:servlet-01
关于maven父子工程的理解
-
父项目里会有:
servlet-01 -
子项目里会有:
javaweb-02-maven org.example 1.0-SNAPSHOT
-
-
maven环境优化
- 将子项目里的webapp.WEB-INF.web.xml换成最新版本
- 将maven结构搭建完整
-
编写一个Servlet程序(导入依赖的servlet的jar包)
-
编写一个普通类
-
实现Servlet接口,这里我们直接继承HttpServlet
package moli.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class helloServlet extends HttpServlet { //由于get和post只是请求实现的不同方式,可以互相调用,业务实现逻辑都一样 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter(); //响应流 writer.print("hello servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } }
-
-
编写Servlet的映射
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。
Archetype Created Web Application hello moli.Servlet.helloServlet hello /hello -
配置tomcat
-
启动测试
idea中通过maven已经导入了包,idea中也能定位到包的位置,本地maven仓库也有对应的jar包存在,但是在本地编译的时候一直报程序包javax.servlet.xxx不存在。
解决方案:
- 还是jar包下载失败,或者没有自动下载缺少的jar包
- 推测原因是idea的版本与maven构建的build不相容
如果你的项目是多模块的,还需要勾选另一个选项
借鉴:https://blog.csdn.net/qq_43377237/article/details/108010414?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163506613416780269847839%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163506613416780269847839&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-5-108010414.pc_search_result_hbase_insert&utm_term=servlet%E7%BC%96%E8%AF%91%E6%97%B6%E4%B8%8D%E6%8A%A5%E9%94%99%EF%BC%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E6%8A%A5%E9%94%99%E7%A8%8B%E5%BA%8F%E5%8C%85%E4%B8%8D%E5%AD%98%E5%9C%A8&spm=1018.2226.3001.4187
1.4Servlet原理
servlet由web服务器调用,在接收到浏览器的请求后会:
-
一个Servlet可以指定一个映射路径
hello /hello -
一个Servlet可以指定多个映射路径
hello /hello hello /hello1 hello /hello2 hello /hello3 -
一个Servlet可以指定通用映射路径
hello /hello resp.sendRedirect("/r/image"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } redirect moli.Servlet.redirectServlet redirect /red
3.2.3.2面试题重定向和转发的区别:
相同点:页面都会跳转
不同点:
- 请求转发的时候,url不会产生变化 307
- 重定向的时候,url地址栏会发生变化 302
3.2.3.3练习Hello World! <%--这里提交的路径,需要寻找到项目路径--%> <%--pageContext.request.contextPath代表当前项目--%>
用户名:
密码:
public class requestTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username+":"+password); resp.sendRedirect("/r/success.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }Title success
4.HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。
获取前端的参数和请求转发:
public class loginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String pwd = req.getParameter("pwd"); String[] hobbys = req.getParameterValues("hobbys"); System.out.println("================="); System.out.println(username); System.out.println(pwd); System.out.println(Arrays.toString(hobbys)); System.out.println("================="); //通过请求转发 req.getRequestDispatcher("/success.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }success
loginServlet moli.Servlet.loginServlet loginServlet /login
5.cookie,seesion 5.1会话
会话:用户打开一个浏览器,点击很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这样的就称之为有状态会话。
你---------------学校
- 入学申请书:学校给的入学申请书
- 学校登记:学校标记你来过了
客户端----------服务端
- 服务端给客户端一个信件,下次客户端访问服务端的时候带上信件就可以了(cookie)
- 服务器登记你来过了,下次你来的时候服务器直接匹配你(seesion)
保存会话的两种技术:cookie
- 客户端技术(响应,请求)
seesion
- 服务器技术,利用这技术可以保存用户的会话信息,我们可以把信息或者数据放在seesion中
常见场景:网站登录后,你下次就不用再登陆了,第二次访问就直接上去了。
5.2cookie
5.2.1上限,删除,乱码cookie:一般会保存在本地的用户目录下appdata。
一个网站cookie的上限:
- 一个cookie只能存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie的大小有限制为4kb
- 300个cookie是浏览器的上限
删除cookie:-
不设置有限期,关闭浏览器,cookie自动失效
-
设置有效期时间为0
//创建一个cookie,名字必须和要删除的cookie名字一致 cookie cookie = new cookie("lastLoginTime", System.currentTimeMillis()+""); //设置cookie有效期为0 cookie.setMaxAge(0); resp.addcookie(cookie);
解决中文乱码:
5.2.2cookie获取上次登录时间//保存用户上一次访问的时间 public class cookieDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器告诉你,你来的时间,把这个时间封装成为一个信件,下次来的时候带上,服务器就知道了。 //解决中文乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); //cookie服务器端从客户端获取 cookie[] cookies = req.getcookies();//这里返回数组,说明cookie存在多个 //判断cookie是否存在 if (cookies!=null){ out.write("你上一次访问的时间是:"); for (int i = 0; i < cookies.length; i++) { cookie cookie = cookies[i]; //获取cookie的名字 if (cookie.getName().equals("lastLoginTime")){ //获取cookie中的值。把字符串解析为长整型的数字 long lastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(lastLoginTime); out.write(date.toString()); } } }else { out.write("这是你第一次访问本站"); } //服务器给客户端响应一个cookie cookie cookie = new cookie("lastLoginTime", System.currentTimeMillis()+""); //设置cookie有效期为一天.有效期:浏览器关闭掉后再次打开,上次的cookie还是存在的 cookie.setMaxAge(24*60*60); resp.addcookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }cookieDemo1 moli.cookie.cookieDemo1 cookieDemo1 /c1
5.3Session 5.3.1概述
- 服务器会给每个用户(浏览器),创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
- 用户登录之后,整个网站他都可以访问—>保存登录用户的信息,保存购物车信息,整个网站经常会使用的数据会被保存在Session中
- Session的方法:
Session和cookie的区别:- cookie是把用户的数据写给浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务器创建
5.3.2使用Sessionpublic class sessionDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //获取session HttpSession session = req.getSession(); //给session中存东西 session.setAttribute("name",new Person("小明",22)); String id = session.getId(); //判断session是否是新创建的 if (session.isNew()){ resp.getWriter().write("session创建成功"+id); }else { resp.getWriter().write("session已经存在"+id); } } }//创建一个Person类 public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "person{" + "name='" + name + ''' + ", age=" + age + '}'; } }public class sessionDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //获取session HttpSession session = req.getSession(); Person person= (Person) session.getAttribute("name"); System.out.println(person.toString()); } }public class sessionDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name"); //手动注销session session.invalidate(); } }sessionDemo1 moli.cookie.sessionDemo1 sessionDemo1 /s1 sessionDemo2 moli.cookie.sessionDemo2 sessionDemo2 /s2 sessionDemo3 moli.cookie.sessionDemo3 sessionDemo3 /s3 1



