Servlet是运行在服务器端的java小程序。
①在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">
<display-name>day01_demo1display-name>
<welcome-file-list> <welcome-file>index.htmlwelcome-file> welcome-file-list>
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>com.igeek.servlet.HelloServletservlet-class> servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern> servlet-mapping> web-app>
|
启动服务器在浏览器中访问servlet:
控制台输出:
到此为止servlet已经配置完成,并且成功被访问。
每一个servlet需要在web.xml文件中配置
每编写一个servlet都需要在web.xml文件中配置两组标签
S1:
其中的子标签:
必须配置的标签:
必须给每一个servlet起一个名称,而且不能重复。此名称在servlet-mapping中会再次使用。
可选标签:
此标签配置的是servlet的完整类名。Tomcat会根据完整的类名创建此servlet的对象。
Servlet-class和jsp-file是二选一的。 就是if else的关系。
S2:
其中字标签
Servlet-name必须和serlvet标签中的servlet-name一致、。
url-pattern配置访问模式。
一个servlet可以配置多个servlet-mapping。多个url可以访问同一个servlet对象。
访问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类,创建类对象,执行对应的方法,响应客户端。
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 //按照迭代器的方式遍历 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("响应客户端--HelloServlet"); //释放资源 writer.close(); } }
|
浏览器中的请求:
响应头消息:
后台控制台中:
编写html,在webContet中添加login.html
DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title heretitle> 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("登录成功"); }else { writer.write("登录失败"); } //释放资源 writer.close(); } }
|
配置:
<servlet> <servlet-name>loginServletservlet-name> <servlet-class>com.igeek.servlet.LoginServletservlet-class> servlet> <servlet-mapping> <servlet-name>loginServletservlet-name> <url-pattern>/loginurl-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,'[email protected]','是一个很强大的忍者'); |
根据数据表创建对应的实体类:
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 } 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("登录成功"); }else { writer.write("登录失败"); } //释放资源 writer.close(); } }
|