servlet是用于开发动态web资源的技术;若是须要发一个动态web资源,须要编写一个java类,并实现servlet接口,并把开发好的java类部署到web服务器中。通常状况下,咱们把实现了servlet接口的java程序称为Servlet。Servlet接口有两个默认的实现类,分别是GenericServlet和HTTPServlet。他们的关系能够在HTTPServlet和GenericServlet的源码中详细学习。html
Tomcat做为Web服务器之一,具备性能优良,很是的小(它是符合Web服务器最小的服务器)的特色。下载tomcat:http://tomcat.apache.org/——找到download——下载完成后,解压到任意目录。前端
Tomcat目录结构:java
1. bin:春芳可执行文件、启动和关闭; 2. conf:存放Tomcat的配置文件; 3. lib:存放服务器须要的jar包; 4. logs:日志文件; 5. temp:临时文件; 6. webapps:存放网站和web目录; 7. work:Tomcat的工做目录;
使用IDEA搭建Web开发环境:mysql
打开idea,并建立一个微博项目;web
配置Tomcat服务器sql
在Run/Debug Comfigurations中,找到Tomcat Server中的local;经过更更名字,修复警告,修改项目名称等来完成搭建。数据库
302:表示重定向;apache
404:表示请求的文件不存在,路径写错等问题;浏览器
500:服务器代码写错了,可能文件中的java代码有误。tomcat
idea开发Servlet须要准备而且导入Servlet须要的jar包。能够经过如下操做进行自动下载jar包:
在IDEA中新建一个web项目,并新建一个package,在其中新建一个Servlet文件。此idea会自动生成一个实现了HttpServlet并重写了doGet和doPost方法的java文件,但文件的Servlet字样都是报红出错的。须要咱们利用idea的只能纠错功能,就能够很是快捷的导入jar包。也能够手动将jar包导入项目的lib文件夹中。最终程序中的Servlet字样不报红,lib目录下有jar包,就是导入成功。
简单来讲,就是将一个请求,转换到另外一个地址。java中,语法以下:
response.sendRedirect("success.jsp");//重定向到成功页面
新建一个properties文件:
driver=com.mysql.jdbc.Driver username=root password=123456 url=jdbc:mysql://localhost:3306/smbms
编写Servlet类:
package com.kuang.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; //读取properties配置文件 public class ServletDemo03 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 { //读取配置文件 //1.得到配置文件的路径 String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties"); System.out.println("取得的路径为:"+realPath); Properties properties = new Properties(); FileInputStream is = new FileInputStream(realPath); properties.load(is);//把文件流加载到配置文件的对象中; String driver = properties.getProperty("driver"); String username = properties.getProperty("username"); String password = properties.getProperty("password"); String url = properties.getProperty("url"); //响应到网页 resp.getWriter().println(driver); resp.getWriter().println(username); resp.getWriter().println(password); resp.getWriter().println(url); //================================== System.out.println(driver); System.out.println(username); System.out.println(password); System.out.println(url); } }
配置web.xml
<servlet> <servlet-name>Demo01</servlet-name> <servlet-class>com.David.servlet.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo01</servlet-name> <url-pattern>/d1</url-pattern> </servlet-mapping>
运行,访问查看localhost:8080/demo02/q3
全部能设置编码的地方都统一设置:数据库,数据库字段,Servlet程序,请求,响应 , 前端,浏览器。
request.setCharacterEncoding("UTF-8");//处理乱码问题 response.setCharacterEncoding("UTF-8");//处理乱码问题
package com.kuang.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RequestDemo01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //查看request对象的方式 System.out.println(request.getContextPath()); //得到web项目路径 System.out.println(request.getRequestURI()); //请求的URL路径 //Remote 远程 System.out.println(request.getRemoteUser()); //得到远程的用户名 System.out.println(request.getRequestedSessionId()); //得到SessionId; System.out.println(request.getServletPath()); //请求servlet的url System.out.println(request.getLocalAddr()); //得到本地地址 防火墙 System.out.println(request.getLocalName()); //得到本地名字 System.out.println(request.getLocalPort()); //得到访问的端口号 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
写前端注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> <%-- Form表单 action:表明要提交的路径,表单要提交到哪里 ,能够提交到一个Servlet //提交到Servlet须要,获取到Web项目的路径下的Servlet method: 提交表单的方式 --%> <h1>注册</h1> <form action="${pageContext.request.contextPath}/r2" method="post"> <p>用户名:<input type="text" name="username"></p> <p>密码:<input type="password" name="password"></p> <p> <input type="submit"> <input type="reset"> </p> </form> </body> </html>
写处理前端提交信息的Servlet
package com.kuang.servlet; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //处理前端提交过来的数据 public class RequestDemo02 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 { //经过HttpServletRequest获取前端用户提交的信息 //req.getParameterValues(); 得到前端传递的控件信息,经过控件的name;可是能够接受多个参数的控件,好比(多选框....) //req.getParameter(); 得到前端传递的控件信息,经过控件的name; req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); //链接数据库,比较数据库中的信息是否匹配 if (username.equals("David")&&password.equals("1234567")){ System.out.println("登陆成功!"); //跳转到成功页面 }else { System.out.println("登陆失败!"); //提示从新注册 } System.out.println(username); System.out.println(password); } }
配置web.xml
<servlet> <servlet-name>RequsetDemo02</servlet-name> <servlet-class>com.David.servlet.RequestDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>RequsetDemo02</servlet-name> <url-pattern>/d2</url-pattern> </servlet-mapping>
提交测试
简单说转发是服务器本身转发到服务器上的另外一个请求。
在Web中,会话表示从浏览器打开某个网站,在这个网站中不管操做了什么,直到关闭浏览器,这一个过程,称之为一个会话。
会话结束的方式:
处理会话是由于:有时候要求,长期保持会话,不管用户关闭少次浏览器,这个会话都要存在。
在客户端留下一点东西,客户端下次会呈现出来过来,服务器就知道客户端以前访问过。
package com.westos.serlvet; 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; public class CookieTest extends HttpServlet { boolean flag = false; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决乱码问题: request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //检查请求的人是否带了Cookie //经过用户的请求,检查它是否有cookie Cookie[] cookies = request.getCookies(); System.out.println("cookie:"+cookies); if (flag){//若是flag是真,来过 if (cookies!=null){//你有cookie for (int i = 0; i < cookies.length ; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("lastLoginTime")){ response.getWriter().println("你上一次来的时间为:"+cookie.getValue()); System.out.println("刷新了cookie"); } } } }else { //若是flag是假,没来过 response.getWriter().println("你是第一次来,还想享受组VIP待遇?"); System.out.println("给该用户一个cookie"); } //创建一个cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //设置cookie保存的时间 //cookie.setMaxAge(); //把这个cookie发给客户端 response.addCookie(cookie); //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+"")); flag = true; } }
在服务器上作记录,下次客户端访问的时候就能判断出客户端以前访问过。
只要客户端一旦链接上服务器,服务器就会自动产生Session;一个链接对应一个session,session能够在一个会话中传递信息;经过setAttribute设置值;经过getAttribute得到值;由服务器端控制,服务器若是重启了,信息就会丢失。
session.invalidate();//经过代码注销会话
<!--session-config能够设置会话自动过时,时间分钟为单位--> <session-config> <session-timeout>1</session-timeout> </session-config>