1. 认识servlet
1.1概念
Servlet是运行在服务器端的java小程序。
1.2编写第一个servlet
①在src中创建一个java类HelloServlet
②让类继承HttpServlet,并且重写doGet方法。
package com.igeek.servlet;
import java.io.IOException;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("执行了HelloServlet--doGet"); } }
|
Tips:javax.servlet包来自于javaEE的标准,由tomcat提供的jar包。不是jdk的jar包。
③打开web.xml配置servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- web工程的显示名称 --> <display-name>day01_demo1</display-name> <!-- 欢迎页的配置 --> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- 配置servlet --> <servlet> <!-- servlet的名称 --> <servlet-name>HelloServlet</servlet-name> <!-- servlet的完整类名 --> <servlet-class>com.igeek.servlet.HelloServlet</servlet-class> </servlet> <!-- 配置Servlet映射 --> <servlet-mapping> <!-- servlet的名称,这里的名称要和对应的serlvet的名称一致 --> <servlet-name>HelloServlet</servlet-name> <!-- 访问此servlet的url --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
|
启动服务器在浏览器中访问servlet:
控制台输出:
到此为止servlet已经配置完成,并且成功被访问。
1.3servlet的执行流程和配置详解
1.3.1Servlet的配置
每一个servlet需要在web.xml文件中配置
每编写一个servlet都需要在web.xml文件中配置两组标签
S1:<servlet></servlet>标签的主要作用是通知tomcat servlet的存在。
其中的子标签:
必须配置的标签:
必须给每一个servlet起一个名称,而且不能重复。此名称在servlet-mapping中会再次使用。
可选标签:
此标签配置的是servlet的完整类名。Tomcat会根据完整的类名创建此servlet的对象。
Servlet-class和jsp-file是二选一的。 就是if else的关系。
S2:<servlet-mapping></servlet-mapping>配置servlet的映射,访问方式。
其中字标签
Servlet-name必须和serlvet标签中的servlet-name一致、。
url-pattern配置访问模式。
一个servlet可以配置多个servlet-mapping。多个url可以访问同一个servlet对象。
1.3.2servlet的执行流程
访问servlet:
流程:
请求服务器
http://localhost:8888/day01_demo1/hello1
http://localhost:8888/ 进入tomcat
day01_demo1 进入应用程序
/hello1 查找web.xml文件,查找servlet-mapping中url-patten为/hello1,通过servlet-name找到对应的servlet配置,查找对应servlet类,创建类对象,执行对应的方法,响应客户端。
1.4servlet处理客户端的请求
Servlet中存在方法doGet()。
就是通过doGet或者doPost处理请求的。
doGet方法有两个参数:
参数1:HttpServletRequest
此参数中包含了所有的请求信息,可以通过此参数对象提供的API获取所有的请求信息。
参数2:HttpServletResponse
此参数为我们提供了响应客户端的API(方法)。
这两个参数是由tomcat(servlet容器)提供的。 我们只管使用即可。
处理案例:
package com.igeek.servlet;
import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.Response;
public class HelloServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取请求头消息 //获取请求头的名称集合 Enumeration<String> names = req.getHeaderNames(); //按照迭代器的方式遍历 while(names.hasMoreElements()) { //循环的取出请求头名称 String name = names.nextElement(); //通过请求头名称获取请求头内容 String value = req.getHeader(name); //输出请求头消息 System.out.println(name+":"+value); }; //执行自己的代码 System.out.println("执行了HelloServlet--doGet"); //通过response响应客户端 //解决响应中的中午乱码问题 resp.setContentType("text/html;charset=utf-8"); //通过response获取一个输出流 (此输出流就指向客户端) PrintWriter writer = resp.getWriter(); //通过输出流输出要响应的字符 writer.write("<h1>响应客户端--HelloServlet</h1>"); //释放资源 writer.close(); } }
|
浏览器中的请求:
响应头消息:
后台控制台中:
1.5完成一个简单的用户登录的案例
编写html,在webContet中添加login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="" method="get"> <p>用户名:<input type="text" name="uname"/></p> <p>密码:<input type="text" name="upass"/></p> <p><input type="submit" value="登录"/></p> </form> </body> </html> |
测试页面:
编写一个loginSerlvet处理登录请求:
package com.igeek.servlet;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //处理登录请求 System.out.println("登录的servlet 处理登录请求"); //获取请求参数 String uname = request.getParameter("uname"); String upass = request.getParameter("upass"); System.out.println("用户名:"+uname+";密码:"+upass); //响应客户端 response.setContentType("text/html;charset=utf-8"); //获取输出流 PrintWriter writer = response.getWriter(); //输出对应的字符串 if("admin".equals(uname) && "123123".equals(upass)) { writer.write("<h1>登录成功</h1>"); }else { writer.write("<h1>登录失败</h1>"); } //释放资源 writer.close(); } }
|
配置:
<!-- 配置登录的servlet --> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.igeek.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> |
修改html页面的表单的action,action中配置url-pattern的值
提交表单:
Tips:
url发生了变化
url“?“后携带的是请求参数。请求参数按照 paramName=paramValue&pname=pvalue…
在后台可以通过request.getParameter获取请求参数。
需要注意的一个细节:表单域中的name属性的值就是请求参数的name
创建数据库webcore
创建数据表:
-- 创建用户表 -- create table Account( accountId int primary key auto_increment, accountName varchar(50) not null, loginName varchar(50) not null unique, loginPass varchar(50) not null, createTime datetime not null, accountTel char(11), accountGender int default '0', accountEmail varchar(100), accountMark varchar(500) );
-- 添加用户 -- insert into account(accountName,loginName,loginPass,createTime,accountTel,accountGender,accountEmail,accountMark) values('卡卡西','admin','123123',now(),'13813813838',default,'kakaxi@igeek.com','是一个很强大的忍者'); |
根据数据表创建对应的实体类:
public class Account { private int accountId; private String accountName; private String loginName; private String loginPass; private String createTime; private String accountTel; private int accountGender; private String accountEmail; private String accountMark; //省略set和get方法 } |
添加数据库连接相关的jar文件
Web项目中将jar添加到WEB-INF/lib文件夹中即可
添加工具类和连接的配置文件:
修改配置文件
url=jdbc:mysql://localhost:3306/webcore username=root password=root initialSize=3 maxActive=20 |
添加一个AccountDAO类,添加根据用户登录名查询用户的方法:
package com.igeek.dao;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler;
import com.igeek.pojo.Account; import com.igeek.util.JDBCUtils;
public class AccountDAO { public Account queryByLoginName(String loginName) { String sql = "select * from account where loginName=?"; QueryRunner runner = new QueryRunner(); Account account = null; try { account = runner.query (JDBCUtils.getCon(), sql,new BeanHandler<Account>(Account.class),loginName); } catch (Exception e) { e.printStackTrace(); } return account; } } |
编写一个service实现登录业务:
package com.igeek.service;
import com.igeek.dao.AccountDAO; import com.igeek.pojo.Account;
public class AccountService {
private AccountDAO accountDAO = new AccountDAO();
/** * 用户登录 * @param loginName * @param loginPass * @return 如果登录失败就返回null 如果成功就返回登录的Account对象 */ public Account login(String loginName,String loginPass) { //通过登录名称查询用户 Account account = accountDAO.queryByLoginName(loginName); if(account == null) { //通过登录名称查询失败,说明登录名称错误 return null; } //如果登录名称正确,则比对登录密码 if(account.getLoginPass().equals(loginPass)) { //密码一致就登录成功 return account; } return null; }; }
|
修改servlet,在servlet的doGet方法中调用service判断登录结果
package com.igeek.servlet;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import com.igeek.pojo.Account; import com.igeek.service.AccountService;
public class LoginServlet extends HttpServlet{
private AccountService service = new AccountService(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //处理登录请求 System.out.println("登录的servlet 处理登录请求"); //获取请求参数 String uname = request.getParameter("uname"); String upass = request.getParameter("upass"); System.out.println("用户名:"+uname+";密码:"+upass); //调用service登录 ,调用login方法,传入uname和upass Account account = service.login(uname, upass); //响应客户端 response.setContentType("text/html;charset=utf-8"); //获取输出流 PrintWriter writer = response.getWriter(); //判断account是否为null,输出对应的字符串 if(account!=null) { writer.write("<h1>登录成功</h1>"); }else { writer.write("<h1>登录失败</h1>"); } //释放资源 writer.close(); } }
|
登录测试: