Servlet
Servlet介绍
servlet是用于开发动态web资源的技术;如果需要发一个动态web资源,需要编写一个java类,并实现servlet接口,并把开发好的java类部署到web服务器中。一般情况下,我们把实现了servlet接口的java程序称为Servlet。Servlet接口有两个默认的实现类,分别是GenericServlet和HTTPServlet。他们的关系可以在HTTPServlet和GenericServlet的源码中详细学习。
web服务器之一Tomcat
Tomcat作为Web服务器之一,具有性能优良,非常的小(它是符合Web服务器最小的服务器)的特点。下载tomcat:http://tomcat.apache.org/——找到download——下载完成后,解压到任意目录。
Tomcat目录结构:
1. bin:春芳可执行文件、启动和关闭;
2. conf:存放Tomcat的配置文件;
3. lib:存放服务器需要的jar包;
4. logs:日志文件;
5. temp:临时文件;
6. webapps:存放网站和web目录;
7. work:Tomcat的工作目录;
使用IDEA搭建Web开发环境:
-
打开idea,并创建一个微博项目;
-
配置Tomcat服务器
在Run/Debug Comfigurations中,找到Tomcat Server中的local;通过更改名字,修复警告,修改项目名称等来完成搭建。
本章节常见的HTTP :超文本传输协议响应
302:表示重定向;
404:表示请求的文件不存在,路径写错等问题;
500:服务器代码写错了,可能文件中的java代码有误。
使用IDEA开发Servlet
idea开发Servlet需要准备并且导入Servlet需要的jar包。可以通过以下操作进行自动下载jar包:
在IDEA中新建一个web项目,并新建一个package,在其中新建一个Servlet文件。此idea会自动生成一个实现了HttpServlet并重写了doGet和doPost方法的java文件,但文件的Servlet字样都是报红出错的。需要我们利用idea的只能纠错功能,就可以非常快捷的导入jar包。也可以手动将jar包导入项目的lib文件夹中。最终程序中的Servlet字样不报红,lib目录下有jar包,就是导入成功。
response
重定向
简单来说,就是将一个请求,转换到另一个地址。java中,语法如下:
response.sendRedirect("success.jsp");//重定向到成功页面
通过servletContext对象实现数据共享
-
新建一个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
Request
乱码问题解决方案:
所有能设置编码的地方都统一设置:数据库,数据库字段,Servlet程序,请求,响应 , 前端,浏览器。
request.setCharacterEncoding("UTF-8");//处理乱码问题
response.setCharacterEncoding("UTF-8");//处理乱码问题
request常用的方法
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);
}
}
Request对象接收前端用户提交的参数
-
写前端注册页面
<%@ 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中,会话表示从浏览器打开某个网站,在这个网站中无论操作了什么,直到关闭浏览器,这一个过程,称之为一个会话。
会话结束的方式:
- 客户端关闭了
- 服务端销毁了
处理会话是因为:有时候要求,长期保持会话,无论用户关闭少次浏览器,这个会话都要存在。
cookie
在客户端留下一点东西,客户端下次会呈现出来过来,服务器就知道客户端之前访问过。
cookie检验服务器是否访问
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,session可以在一个会话中传递信息;通过setAttribute设置值;通过getAttribute获得值;由服务器端控制,服务器如果重启了,信息就会丢失。
会话注销的方法
-
session.invalidate();//通过代码注销会话
-
<!--session-config可以设置会话自动过期,时间分钟为单位--> <session-config> <session-timeout>1</session-timeout> </session-config>