servlet
- servlet:一个servlet就是一个小java程序,servlets运行在web服务器(Tomcat),servlets接收和响应来自客户端的请求。
作用:
- 接收请求
- 处理请求
- 完成响应
- servlet示例代码
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//一个servlet只能处理一个指定的请求
//应该指定servlet处理哪个请求
//需要在web.xml配置信息
public class MyFirstServlet implements Servlet {
//初始化
@Override
public void init(ServletConfig config) throws ServletException {}
//获取servlet配置信息
@Override
public ServletConfig getServletConfig() {
return null;
}
//服务
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//service方法是用来处理客户端的请求
System.out.println("我是第一个Servlet");
//ServletResponse res 给浏览器发送一个响应
//获取一个写数据的对象
PrintWriter write=res.getWriter();
write.write("HelloWorld!");
}
//获取servlet信息
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
//销毁
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
- web.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>FirstWeb</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>
<!-- 配置servlet标签配置servlet的类信息,告诉服务器我有这个servlet -->
<servlet>
<description></description>
<display-name>MyFirstServlet</display-name>
<!-- 配置servlet的名字,相当于给servlet取别名,给程序员看的-->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 配置servlet类的全名,给服务器看,以便于通过全类名找到该类 -->
<servlet-class>com.aiguigu.servlet.MyFirstServlet</servlet-class>
</servlet>
<!-- servlet映射信息,也就是servlet用来处理哪个请求-->
<servlet-mapping>
<!-- 刚才servlet的别名 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 告诉服务器这个servlet用来处理哪个请求 http://localhost:8080/FirstWeb/helloWorld-->
<url-pattern>/helloWorld</url-pattern>
</servlet-mapping>
</web-app>
- servlet流程
- 创建自己的类来实现servlet接口
- 在servlet方法里面写代码
- 在web.xml配置
- 用户在浏览器地址栏输入http://localhost:8080/FirstWeb/helloWorld,是否有静态资源对应,没有对应的静态资源,所以服务器就去找动态资源,即在web.xml中的servlet-mapping中找(但一般先找动态资源再找静态资源)
- servlet生命周期
- 创建一个servlet对象
- 调用Init方法,初始化servlet
- 调用service方法,以后请求只调用service方法,整个运行期间只创建了一个servlet对象,servlet是单实例,多线程运行,在servlet里为了线程安全不定义共享变量
- 当项目从服务器上卸载,服务器会调用destroy方法,销毁servlet方法,做善后工作
- servletConfig
- web.xml
<servlet> <!-- 配置servlet的名字,相当于给servlet取别名--> <servlet-name>MyFirstServlet</servlet-name> <!-- 配置servlet类的全名 --> <servlet-class>com.aiguigu.servlet.MyFirstServlet</servlet-class> <init-param> <param-name>username</param-name> <param-value>zhoucanlong</param-value> </init-param> </servlet
- java
//初始化 @Override public void init(ServletConfig config) throws ServletException { //ServletConfig是封装了servlet配置信息的对象 //一个servlet对应一个ServletConfig,封装的是当前的servlet的配置信息 this.config=config; //1.getServletName()获取配置的servlet别名 String servletName=config.getServletName(); System.out.println(servletName); //2.获取servlet初始化参数 String username=config.getInitParameter("username"); System.out.println(username); //3.获取ServletContext对象,代表当前servlet的上下文,代表当前的web项目信息 ServletContext context=config.getServletContext(); System.out.println(context); }
- ServletContext
- web.xml
<!-- 配置web初始化的参数 --> <context-param> <param-name>user</param-name> <param-value>root</param-value> </context-param> <servlet> <servlet-name>ContextServlet</servlet-name> <servlet-class>com.aiguigu.servlet.ContextServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ContextServlet</servlet-name> <url-pattern>/ContextServlet</url-pattern> </servlet-mapping>
- java
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //获取到的ServletConfig获取ServletContext ServletConfig servletConfig=this.getServletConfig(); ServletContext servletContext=servletConfig.getServletContext(); //1.一个web应用对应一个servletContext //2.功能 // 1)获取web项目初始化信息 String user=servletContext.getInitParameter("user"); System.out.println(user); // 2)获取web项目的路径 String path=servletContext.getContextPath(); System.out.println(path); // 3)获取资源的真实路径 // 虚拟路径:网络访问使用虚拟路径,每一个虚拟路径应该对应一个实际的资源, // 动态资源(文件的形式)、动态资源(只是启动一段代码) // 真实路径:文件在磁盘中的存储路径 String readPath=servletContext.getRealPath("/index.html"); System.out.println(readPath); // 4)可以作为最大域对象共享数据,四大域对象 application }
- HttpServlet
//HttpServlet是专门用来处理http请求的servlet public class MyEclipseServlet extends HttpServlet { private static final long serialVersionUID = 1L; public MyEclipseServlet() { super(); System.out.println("我是构造器"); } //我们发现每次请求调用doGet方法 //经常有get请求和post请求 //post请求目前只有一种,表单提交的时候指定method="post" //get请求,回车,超链接,img src=""; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("我是doGet"); //正常不区分请求方式 doPost(request,response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //写业务 System.out.println("我是doPost"); } }
- HttpServletResponse
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //HttpServletRequest request 代表就是封装浏览器请求信息的对象,收到浏览器端的请求 //HttpServletResponse response 代表就是要发送浏览器的响应对象,封装响应信息 //1.可以给浏览器响应字符串 PrintWriter writer=response.getWriter(); writer.write("HelloWorld"); //2.可以重定向到一个页面或者其他资源,重定向就是服务器告诉浏览器请求别的资源 //已经对request响应完成 response.sendRedirect("success.html"); }
- HttpServletRequest
- java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //http请求: 请求首行 请求头 空行 请求体(封装的请求数据-post) //get请求将所有携带的参数放在url //1.获取请求数据 get放在url后面 post放在请求体里 String username=request.getParameter("username"); System.out.println(username); //结果只提交一个结果 //String aihao=request.getParameter("aihao"); //使用getParameterValues()获取多选框的内容 String[] aihao=request.getParameterValues("aihao"); if(aihao!=null){ for(String str:aihao){ System.out.println(str); } } System.out.println(aihao); //2.获取请求头信息 //userAgent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; Win64; x64; Trident/7.0; LCTE) String userAgent=request.getHeader("User-Agent"); System.out.println(userAgent); //3.转发一个页面/资源 //先获取一个请求转发器 RequestDispatcher dispatcher=request.getRequestDispatcher("success.html"); //将请求转发出去 dispatcher.forward(request, response); }
- html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>helloWorld</h1> <a href="http://localhost:8080/FirstWeb/MyEclipseServlet">链接</a> <form action="MyEclipseServlet" method="post"> 用户名:<input type="text" name="username"/> <input type="submit"/> </form> <form action="MyEclipseServlet" method="get"> 用户名:<input type="text" name="username"/> <input type="submit"/> 爱好:<br/>篮球<input type="checkbox" name="aihao" value="lanqiu"/> <br/>足球<input type="checkbox" name="aihao" value="zuqiu"/> <br/>乒乓球<input type="checkbox" name="aihao" value="pingpanqiu"/> </form> </body> </html>
- 转发和重定向
- 转发和重定向的区别
- java代码
//获取请求头信息 String header = request.getHeader("User-Agent"); System.out.println(header); //1.重定向到页面,就是告诉浏览器重新请求一个资源 //重定向路径:http://localhost:8080/FirstWeb/success.html //虚拟路径:http://localhost:8080/FirstWeb/MyServlet2 // response.sendRedirect("success.html"); //2.转发到页面 //转发:服务器处理完成以后,转交到另外一个资源,当我们转发的资源是一个页面资源或静态资源,服务器会给浏览器返回这个资源 //当转交给servlet时候,servlet可以继续处理, //request.getRequestDispatcher("success.html").forward(request,response); //3.转发和重定向的区别
- 请求转发
- 响应重定向
- 登录练习
- 登录
1)访问登录界面
2)填写用户密码后提交表单
3)服务器判断用户是否存在
4)如果登录失败-》返回用户名或者密码错误
如果登录成功-》登录成功
- 注册
1)访问注册页面
2)填写注册信息,提交给服务器
3)服务器应该保存用户
4)当用户已经存在-》返回注册失败
当用户注册成功-》
- 代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取用户信息 String username=request.getParameter("username"); String password=request.getParameter("password"); String repwd=request.getParameter("repwd"); String email=request.getParameter("email"); //判断用户是否可以注册,只要用户名不是admin就让注册 if(!"admin".equals(username)){ request.getRequestDispatcher("RegistSuccess.html").forward(request, response); }else{ request.getRequestDispatcher("RegistFail.html").forward(request, response); } }
- 响应乱码
响应后出现了如下情况
//告诉浏览器传输的数据的内容类型 //第一种方法 //response.setContentType("text/html"); //告诉浏览器编码 //response.setCharacterEncoding("UTF-8"); //第二种方法 //response.addHeader("Content-type", "text/html;charset=UTF-8"); //第三种方法 response.setContentType("text/html;charset=UTF-8"); //获取流 PrintWriter writer=response.getWriter(); writer.write("你好世界"); //解决字符乱码存在以下地方 //1)响应给浏览器的数据是乱码, // 原因:是浏览器不知道数据的类型及编码格式 // 解决:告诉浏览器内容类型及编码格式,在响应头里Content-type:text/html;charset=UTF-8 // 方法:如上的三种 //当我们在表单中获取的也是乱码 //1.post乱码的原因 //浏览器将数据编码并提交上来,但是服务器不知道编码规则 //解决方法:让服务器知道编码规则即可,重新设置请求的编码格式 request.setCharacterEncoding("UTF-8"); String username=request.getParameter("username"); System.out.println(username); //2.get乱码的原因 //原因:浏览器将地址栏编码了,服务器不知道,而且8080端口接收到url以后,已经按照默认的解码方法解码 //所以request.setCharacterEncoding("UTF-8");方法没用 //解决方法:修改tomcat的server.xml配置文件,在8080端口出添加URIEncoding="utf-8"
- 项目路径问题
绝对路径以/开始,所有在页面上的绝对路径,/都代表从服务器的根开始 http://localhost:8080 ,所以在页面写绝对路径需要加上项目名
在servlet中请求转发也可以用绝对路径来写/,是以WebContent作为根的,请求转发到其他页面只需要相对WebContent来写
在servlet中响应重定向也可以用绝对路径来写,是以服务器为根的,需要加上项目名。
//动态获取项目的根目录,项目路径 ServletContext context=getServletContext(); String path=context.getContextPath();
导入项目,如果出现项目重复无法导入,需要在项目的.project文件中修改项目名
- base标签
使用base标签,作用就是指定页面上所有的路径的基础路径,所有的相对路径都是以我指定的基础路径开始,只有相对路径的写法,会按照base标签指定的基础路径来拼接新的路径,指定所有相对路径的起始路径,以后的相对路径参考的都是base标签指定的路径,而不是当前资源。
<base href="http://localhost:8080/LoginAndRegister"/>
- 类加载器加载资源
- 先导入mysql的jar包
- jdbc.properties(mysql8.0.11跟以往有些差别)
user=root password=123456 jdbcDriver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useSSL=FALSE&serverTimezone=UTC
- jdbc.properties需要放到src目录下,否则会出现找不到该文件的问题,或者在项目根目录下新建一个config文件夹,放在下面
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class JDBCUtils { public static Properties properties=new Properties(); static{ try { //properties.load(new FileInputStream(new File("jdbc.properties"))); //Class.forName("com.mysql.cj.jdbc.Driver"); //类加载器获取资源,会在类路径下找(WEB-INF/classes) ClassLoader loader=JDBCUtils.class.getClassLoader(); InputStream stream=loader.getResourceAsStream("jdbc.properties"); properties.load(stream); Class.forName(properties.getProperty("jdbcDriver")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConnection() throws SQLException { Connection connection=null; connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=FALSE&serverTimezone=UTC","root","123456"); return connection; } }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection connection=null; try { connection=JDBCUtils.getConnection(); } catch (SQLException e) { e.printStackTrace(); } System.out.println(connection); response.setContentType("text/html;charset=utf-8"); response.getWriter().write("登录成功"); }
",“root”,“123456”);
return connection;
}
}```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection connection=null; try { connection=JDBCUtils.getConnection(); } catch (SQLException e) { e.printStackTrace(); } System.out.println(connection); response.setContentType("text/html;charset=utf-8"); response.getWriter().write("登录成功"); }