javaweb-servlet àì夳堔傛蜴生んèń 2022-09-11 13:28 179阅读 0赞 ## 1.Servlet定义 ## 是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。 ## 2.Servlet使用方法 ## HttpServlet类实现了GenericServlet接口,而GenericServlet接口又继承了Servlet接口,因此我们只需要使用继承了HttpServlet的类即可。 public class HelloServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doPost(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } ## 3.配置请求别名 ## 存放资源的主机域名都是相对固定的如:http://localhost:8080/,通过设置请求别名就可以做到访问我们不同资源文件(Servlet实现类)。请求别名配置项位于web.xml文件。配置格式如下。 <servlet> <!--名称--> <servlet-name>HelloServlet</servlet-name> <!--接口实现类完整路径--> <servlet-class>com.han.servlet.HelloServlet</servlet-class> </servlet> <!-- 可以拥有多个请求别名 可以使用通配符定义 --> <servlet-mapping> <!--与servlet名称对应--> <servlet-name>HelloServlet</servlet-name> <!--请求别名 以 '/' 开头--> <url-pattern>/HelloServlet</url-pattern> </servlet-mapping> servlet-name的设置支持使用通配符,因此可以将所有不存在的页面设置为一个特殊的错误界面。 <!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.han.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> 在web.xml配置文件中,如果使用通配符的话要将其放在最后,因为顺序会影响识别的顺序。 ## 4.Servle常用的一些方法 ## ### 4.1PrintWriter输出内容 ### 调用响应(resp)中的getWriter方法,获得相应流并输出内容。 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet方法执行了"); PrintWriter writer= resp.getWriter();//获得相应流 writer.println("hello,servlet"); } ### 4.2ServletContext常用方法 ### ServletContext可以实现页面之间的相互通信。 首先在properties文件夹下创建一个静态文件,命名为db.properties,内容为`username=xxx password=123456` 获取属性路径下的流,申请一个Properties对象,并加载之前获取的属性流,使用pro.getProperty读取属性值并输出。 类似的可以通过此方法访问静态资源中的属性。 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties pro=new Properties(); pro.load(is); String user=pro.getProperty("username"); String pwd=pro.getProperty("password"); resp.getWriter().println(user+"\n"+pwd); } 请求转发的实现,使用requestDispatcher的方法,首先利用转发的目标路径(“/gp”)创造requestDispatcher对象,之后使用该对象的forward方法,将请求和响应作为参数传入,完成转发。 当访问通过别名访问Servlet\_request\_demo01类时,会转发到/gp的页面下。 public class Servlet_request_demo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext i=this.getServletContext(); RequestDispatcher requestDispatcher=i.getRequestDispatcher("/gp");//转发的请求路径 requestDispatcher.forward(req,resp);//转发请求 } } ### 4.3通过响应下载文件 ### 重点是要使用resp.setHeader方法设置响应的头信息,并通过流下载 resp.setHeader(“Content-Disposition”,“attachment;filename=”+FileName); protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String RealPath="D:\\javaweb-project\\javaweb-project-servlet\\target\\javaweb-project-servlet\\WEB-INF\\1.jpg"; //获取下载的对象 System.out.println("下载文件的路径是"+RealPath); //获取下载文件的名字 String FileName=RealPath.substring(RealPath.lastIndexOf("\\")+1);// /的下一个开始到结尾的字串一定是文件名。 //设置相应头 resp.setHeader("Content-Disposition","attachment;filename="+FileName);//这里是分号 //获取下载文件的输入流 FileInputStream in=new FileInputStream(RealPath); //缓冲区 byte[] bytes=new byte[1024]; int len=0; ServletOutputStream out=resp.getOutputStream(); //响应的输出流 while((len=in.read(bytes))!=-1){ out.write(bytes,0,len); } out.close(); in.close(); } ### 4.4resp验证码(使用图片类) ### 使用setHeader将refresh属性设置为3,设置自动刷新时间。 BufferedImage创建一个空的图片对象,将生成的随机数画在图片中。 为了优化,禁止浏览器缓存,通过setHeader设置,resp.setDateHeader(“expires”,-1); resp.setHeader(“Cache-Control”,“no-cache”); resp.setHeader(“Pragma”,“no-cache”); 并告知浏览器接下来,以图片的形式打开,resp.setContentType(“image/jpeg”); 并将其输出到浏览器中。 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置浏览器每3秒刷新一次 resp.setHeader("refresh","3"); //在内存中创建一个图片 //图片类的使用 BufferedImage bufferedImage=new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); Graphics2D g=(Graphics2D) bufferedImage.getGraphics();//创建笔。 g.setColor(Color.white); //填充图片 g.fillRect(0,0,80,20); //给图片写数据 g.setColor(Color.blue); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); //告诉浏览器这个请求的方式用浏览器打开 resp.setContentType("image/jpeg"); //禁止浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片写给浏览器 boolean write=ImageIO.write(bufferedImage,"jpg",resp.getOutputStream()); } private String makeNum(){ Random random=new Random(); String num=random.nextInt(9999999)+""; StringBuffer sb=new StringBuffer(); for(int i=0;i<7-num.length();i++){ sb.append("0"); } num=sb.toString()+num; return num; } 类似的也可以实现倒计时的功能。 ### 5.resp重定向 ### 使用sendRedirect方法 resp.setHeader("Location","/javaweb_project_servlet_war/img"); resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);//等价于302 //上两行等价于下面的一行. resp.sendRedirect("/javaweb_project_servlet_war/img"); 重定向与转发都是跳转到新的页面,但重定向会改变URL,转发不改变URL。 ### 6.cookie和session ### #### 6.1cookie和session的区别 #### 1、cookie数据存放在客户的浏览器上,session数据放在服务器上. 当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的session\_id,服务器根据当前session\_id判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。 Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。 2.设置cookie时间可以使cookie过期。但是使用session-destory,我们将会销毁会话。 3.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型) #### 6.2cookie #### 建立一个页面,显示上次访问的时间。 package com.han.cookie; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8");//解决乱码问题 PrintWriter out=resp.getWriter(); Cookie[] cookies= req.getCookies();//通过请求获取cookie if(cookies!=null){ out.write("上一次访问的时间"); for(int i=0;i<cookies.length;i++){ Cookie cookie=cookies[i];//找到cookie中lastlogintime属性 if(cookie.getName().equals("lastlogintime")){ //获取cookie中的数值 //getvalue获取的是一个string数值,目标是转化成date类的时间,可以先通过long的parselong方法转化为long,在创建date对象。 long lastlogintime=Long.parseLong(cookie.getValue()); Date date=new Date(lastlogintime); out.write(date.toLocaleString()); } } } else{ out.println("第一次访问"); } //如果需要存储中文,可以使用URLEncoder.encode("中文","utf-8"),并且取出的时候使用URLDecoder.urldecode解码输出。 //每次访问的时候,将当前时间的键值对作为参数构造一个新的cookie对象,通过请求 Cookie cookie=new Cookie("lastlogintime",System.currentTimeMillis()+""); cookie.setMaxAge(24*60*60);//设置cookie有效期 resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } #### 6.3session #### 服务器会给每一个用户(浏览器)创建一个Session对象 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在 用户登录之后,整个网站都可以访问!—>保存用户的信息;保存购物车的信息。 package com.han.cookie; public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.解决乱码问题 resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //2.创建并设置session HttpSession session= req.getSession(); session.setAttribute("name","张兵"); String sessionid=session.getId(); PrintWriter writer= resp.getWriter(); if(session.isNew()){ writer.println("session创建成功,id为"+sessionid); } else{ writer.println("session已经创建了,id为"+sessionid); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } } package com.han.cookie; public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //获取session中的信息。 HttpSession session=req.getSession(); String name=(String) session.getAttribute("name"); PrintWriter writer= resp.getWriter(); writer.println(name); //注销session,直接注销id,会生成新的sessionid。 session.removeAttribute("name"); session.invalidate(); //也可以通过设置web.xml配置进行 /*<session-config> <session-timeout>15</session-timeout> </session-config>*/ } }
还没有评论,来说两句吧...