案例1(http请求):
新建一个登陆表单,demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
超链接,提交表单都属于http请求
一次请求中包含:请求行,请求头,请求体(表单post提交数据)
目前将http请求分为get和post:
get:
1.超链接
2.在浏览器地址栏中直接输入地址访问
3.js window.open(url)
location.assign(url);
location.replace(url);
4.表单 method="get"
post:
表单 method="post"
get
主要用于从服务器获取数据
也可以向服务器发送数据,数据在地址中传递,会在地址栏中显示
长度有限制
相对不安全
post
主要用于向服务器发送数据
提交数据在请求体中发送,长度没有限制(例如可以提交文件),
数据在请求体中相对安全
-->
<a href="login?name=张三&age=11">访问</a>
<form action="login" method="post">
账号<input type="text" name="account"> <br/>
密码<input type="password" name="password"> <br/>
性别<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女<br/>
职业:<select name="job">
<option value="java工程师">java工程师</option>
<option value="c++工程师">c++工程师</option>
<option value="python工程师">python工程师</option>
</select><br/>
课程<input type="checkbox" name="course" value="python">python
<input type="checkbox" name="course" value="java">java
<input type="checkbox" name="course" value="C++">C++
<input type="checkbox" name="course" value="c">c
<input type="submit" value="登录">
</form>
</body>
</html>
selvelt搭建:
package com.ff.firstWeb.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
servlet搭建
继承HttpServlet 实现 Servlet init service destroy
重写父类方法
*/
public class LoginServlet extends HttpServlet {
/*
在客户端第一次访问LoginServlet时创建,服务器时创建
只被调用一次,只创建一个servlet对象 单实例的
*/
public LoginServlet() {
System.out.println("LoginServlet无参构造方法");
}
/*
初始化,在对象创建后,构造方法执行后,调用init方法,完成一些初始化操作
只执行一次
如何没有初始化操作,可以不用重写init(),但是服务器仍然会调用init(),调用父类中
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
System.out.println(config.getInitParameter("count"));
}
/*
提供服务器,
每次请求都会调用service
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service");
}
/*
在服务器关闭前,servlet销毁之前调用,
只执行一次
可以在此方法中完成一些最终操作:例如保存日志,数据备份
如何没有最终操作,可以不用重写destroy(),但是服务器仍然会调用destroy(),调用父类中
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
xml 可扩展标记语言,主要用于存储数据
web.xml 存储web项目的配置信息,在服务器启动时,由服务器读取
-->
<!--配置servlet-->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.ff.firstWeb.servlet.LoginServlet</servlet-class><!--反射机制可以根据类的地址动态创建对象-->
<!--配置初始化参数-->
<init-param>
<param-name>count</param-name>
<param-value>10</param-value>
</init-param>
<load-on-startup>0</load-on-startup><!--值<0 第一次访问时创建,>=0服务器启动时创-->
</servlet>
<!--给servlet配置一个访问地址,映射地址-->
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern><!--映射地址,以/开头-->
</servlet-mapping>
<welcome-file-list>
<welcome-file>demo.html</welcome-file>
</welcome-file-list>
</web-app>
运行结果部分截图:
Servlet生命周期:
案例2:
新建表单,demo.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
超链接,提交表单都属于http请求
一次请求中包含:请求行,请求头,请求体(表单post提交数据)
目前将http请求分为:
get
超链接
在浏览器地址栏中直接输入地址访问
js window.open(url)
location.assign(url);
location.replace(url);
表单 method="get"
post
表单 method="post"
get
主要用于从服务器获取数据
也可以向服务器发送数据,数据在地址中传递,会在地址栏中显示
长度有限制
相对不安全
post
主要用于向服务器发送数据
提交数据在请求体中发送,长度没有限制(例如可以提交文件),
数据在请求体中相对安全
-->
<a href="login?name=张三&age=11">访问</a>
<form action="login" method="post">
账号<input type="text" name="account"> <br/>
密码<input type="password" name="password"> <br/>
性别<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女<br/>
职业:<select name="job">
<option value="java工程师">java工程师</option>
<option value="c++工程师">c++工程师</option>
<option value="python工程师">python工程师</option>
</select><br/>
课程<input type="checkbox" name="course" value="python">python
<input type="checkbox" name="course" value="java">java
<input type="checkbox" name="course" value="C++">C++
<input type="checkbox" name="course" value="c">c
<input type="submit" value="登录">
</form>
</body>
</html>
servlet 搭建:
package com.ff.firstWeb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
servlet搭建
继承HttpServlet 实现 Servlet init service destroy
重写父类方法
*/
public class LoginServlet_back extends HttpServlet {
/*
在客户端第一次访问LoginServlet时创建,服务器时创建
只被调用一次,只创建一个servlet对象 单实例的
*/
/*public LoginServlet() {
System.out.println("LoginServlet无参构造方法");
}*/
/*
初始化,在对象创建后,构造方法执行后,调用init方法,完成一些初始化操作
只执行一次
如何没有初始化操作,可以不用重写init(),但是服务器仍然会调用init(),调用父类中
*/
/* @Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
System.out.println(config.getInitParameter("count"));
}*/
/*
提供服务器,
每次请求都会调用service
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service");
}
/*
在服务器关闭前,servlet销毁之前调用,
只执行一次
可以在此方法中完成一些最终操作:例如保存日志,数据备份
如何没有最终操作,可以不用重写destroy(),但是服务器仍然会调用destroy(),调用父类中
*/
/*@Override
public void destroy() {
System.out.println("destroy");
}*/
}
案例3(接受请求中的数据):
package com.ff.firstWeb.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.util.Arrays;
import java.util.Enumeration;
/*
servlet搭建
继承HttpServlet 实现 Servlet init service destroy
重写父类方法
*/
public class LoginServlet_back1 extends HttpServlet {
//无参构造默认就有
//init 可以调用父类的
//service 可以调用父类的 在父类中判断请求方式 get请求--doGet() post请求-doPost()
//org.apache.catalina.connector.RequestFacade
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("doGet"+req);
//接收请求中的数据(自己提交的数据)
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name+"::"+age);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求数据解码格式
req.setCharacterEncoding("utf-8");
//System.out.println("doPost"+req);
//接收请求中的数据(自己提交的数据)
String account = req.getParameter("account");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String job = req.getParameter("job");
String[] course = req.getParameterValues("course");
System.out.println(account+"::"+password+"::"+sex+"::"+job+"::"+ Arrays.toString(course));
//接收请求中的数据(请求行,请求头,请求体)
System.out.println(req.getMethod());
System.out.println(req.getRemoteAddr());//获得客户端ip
System.out.println(req.getServerName());//获得服务器主机名 ip/域名
System.out.println(req.getServerPort());//服务器端口号
System.out.println(req.getScheme());
System.out.println(req.getProtocol());
System.out.println(req.getContentType());
System.out.println(req.getContentLength());
System.out.println(req.getContextPath());//获得项目的根路径
System.out.println(req.getHeader("User-Agent"));//根据请求的名字获得值
Enumeration<String> headerNames = req.getHeaderNames();//获得所有请求的名字
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
System.out.println(name+"::"+req.getHeader(name));
}
//调用其他java程序进行处理(例如与数据交互)
//课后练习
}
//destroy可以调用父类的
}
案例4(接受请求中的数据,做出响应):
package com.ff.firstWeb.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;
/*
servlet搭建
继承HttpServlet 实现 Servlet init service destroy
重写父类方法
*/
public class LoginServlet_back2 extends HttpServlet {
//无参构造默认就有
//init 可以调用父类的
//service 可以调用父类的 在父类中判断请求方式 get请求--doGet() post请求-doPost()
//org.apache.catalina.connector.RequestFacade
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("doGet"+req);
//接收请求中的数据(自己提交的数据)
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name+"::"+age);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求数据解码格式
req.setCharacterEncoding("utf-8");
//接收请求中的数据(自己提交的数据)
String account = req.getParameter("account");
String password = req.getParameter("password");
//调用其他java程序进行处理(例如与数据交互)
// System.out.println(10/0);
//向客户端做出响应 本质使用IO 字符输出流
//设置响应内容的编码格式
//resp.setContentType("text/html;charset=utf-8");
resp.setHeader("content-type", "text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
if(account.equals("admin")&&password.equals("111")){
out.print("<h2>登录成功</h2>");
}else{
out.print("<h2>账号或密码错误</h2>");
}
}
//destroy可以调用父类的
}
案例5(有弊端,引出jsp):
package com.ff.firstWeb.servlet;
import javax.servlet.ServletConfig;
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;
import java.util.Arrays;
import java.util.Enumeration;
/*
servlet搭建
继承HttpServlet 实现 Servlet init service destroy
重写父类方法
*/
public class LoginServlet extends HttpServlet {
//无参构造默认就有
//init 可以调用父类的
//service 可以调用父类的 在父类中判断请求方式 get请求--doGet() post请求-doPost()
//org.apache.catalina.connector.RequestFacade
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("doGet"+req);
//接收请求中的数据(自己提交的数据)
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name+"::"+age);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求数据解码格式
req.setCharacterEncoding("utf-8");
//接收请求中的数据(自己提交的数据)
String account = req.getParameter("account");
String password = req.getParameter("password");
//调用其他java程序进行处理(例如与数据交互)
//创建管理员表 id,账号,密码 jdbc验证账号密码是否正确
//创建管理员登录日志表, id,账号,ip,登录时间 登录成功后保存登录日志
//向客户端做出响应 本质使用IO 字符输出流
resp.setHeader("content-type", "text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
if(account.equals("admin")&&password.equals("111")){
//早期的动态(数据可以动态从数据库获取)页面就是从serlet中输出的
/* out.print("<html>");
out.print("<head>");
out.print("</head>");
out.print("<body>");
for (int i = 0; i < 10; i++) {
out.print("<h1>"+i+"</h1>");
}
out.print("</body>");
out.print("<html>");*/
//问题:响应的页面非常复杂
//解决办法:使用jsp的动态页面,本质也是serlet,作用就是向客户端响应内容,引出jsp
}else{
out.print("<h2>账号或密码错误</h2>");
}
}
//destroy可以调用父类的
}