Web-第八天 Servlet学习 今日内容介绍 案例:完成用户登录的功能 今日内容学习目标 可以独立编写Servlet程序 可以使用request接收请求参数 了解ServletConfig的使用 在网站的首页上,登录的链接,点击登录的链接,可以跳转到登录的页面.在登录的页面中输入用户名和密码点击登录的案例.完成登录的功能. Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态资源。 Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),且最重要。 用来处理从客户端发送过来的请求,并对该请求作出响应。 Servlet的任务有: 1. 获取请求数据 2. 处理请求 3. 完成响应 Servlet规范要求:Servlet程序需要编写实现类,并在web.xml进行配置。 实现类:通常继承javax.servlet.http.HttpServlet类,并复写doGet和doPost方法。 doGet()方法用于处理get请求。 doPost()方法用于处理post请求。 配置信息:在web.xml进行配置。 1. 创建类,继承HttpServlet,复写doGet和doPost方法 package cn.com.javahelp.demo01.a_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 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get请求将执行"); } @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post请求将执行"); } } 2. 编写配置文件 <!-- demo01 servlet hello start * <servlet> 注册servlet <servlet-name> servlet名称,当前xml中唯一 <servlet-class> servlet实现类的全限定类名 * <servlet-mapping> 给注册的servlet添加映射路径 <servlet-name> 已经注册的servlet名称。注意:必须与注册的名称一致。 <url-pattern> 访问路径。要求:必须/开头 --> <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>cn.com.javahelp.demo01.a_servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- demo01 servlet hello end --> 3. 浏览器访问 在浏览器地址栏输入:http://localhost:8080/day13/hello 浏览器显示空白页面 控制打印信息 请求参数 方法名 描述 String getParameter(String name) 获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。 例如:username=jack 编写步骤 1. 编写表单,提供表单字段:username、password、hobby,以post方式提交 <form action="../demo01ParamServlet" method="post"> 用户名:<input type="text" name="username" value="jack" /> <br/> 密码:<input type="text" name="password" value="1234" /> <br/> 爱好:<input type="checkbox" name="hobby" value="抽烟" checked="checked"/> 抽烟 <input type="checkbox" name="hobby" value="喝酒" checked="checked" /> 喝酒 <input type="checkbox" name="hobby" value="烫头" /> 烫头 <br/> <input type="submit" value="post提交" /> </form> 2. 编写Servlet实现类,使用对应方法获得请求参数,并处理POST中文乱码。 public class Demo01ParamServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //0请求参数中文乱码 request.setCharacterEncoding("UTF-8"); //1 使用参数名获得一个值 //1.1 获得用户名 String username = request.getParameter("username"); //1.2 获得密码 String password = request.getParameter("password"); System.out.println(username + " : " + password); //2 使用参数名获得一组值 String[] hobbies = request.getParameterValues("hobby"); System.out.println(Arrays.toString(hobbies)); //3 获得所有数据,遍历Map System.out.println("---------------"); Map<String,String[]> allData = request.getParameterMap(); for (Map.Entry<String, String[]> entry : allData.entrySet()) { System.out.print(entry.getKey()); System.out.print( " --> "); System.out.println(Arrays.toString(entry.getValue())); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* 开发中我们发现,doPost和doGet两个方法编写的内容相同 * 所以常使用一个调用另一个,此处我们使用doPost调用doGet * 所有的内容之后都编写doGet方法中 */ doGet(request, response); } } 3. 编写Servlet,配置文件 <servlet> <servlet-name>Demo01ParamServlet</servlet-name> <servlet-class>cn.com.javahelp.demo01.b_request.Demo01ParamServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo01ParamServlet</servlet-name> <url-pattern>/demo01ParamServlet</url-pattern> </servlet-mapping> 4. 测试,访问“http://localhost:8080/day13/02.request/form.html”,并提交表单。控制台显示 Servlet的代码 public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 1.接收表单提交的参数. String username = request.getParameter("username"); String password = request.getParameter("password"); // 2.封装到实体对象中. User user = new User(); user.setUsername(username); user.setPassword(password); // 3.调用业务层处理数据. UserService userService = new UserService(); User existUser = userService.login(user); // 4.根据处理结果显示信息(页面跳转). if(existUser == null){ // 登录失败 response.getWriter().println("Login Fail..."); }else{ // 登录成功 response.getWriter().println("Login Success..."); } } catch (Exception e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } Service的代码: public class UserService { /** * 业务层用户登录的方法: * @param user * @return * @throws SQLException */ public User login(User user) throws SQLException { // 调用DAO完成对数据库查询的操作: UserDao userDao = new UserDao(); return userDao.login(user); } } DAO的代码 public class UserDao { /** * 用户登录的DAO的方法: * @param user * @return * @throws SQLException */ public User login(User user) throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); String sql = "select * from user where username =? and password = ?"; User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword()); return existUser; } } 生命周期:就是一个对象从创建到销毁的过程. Servlet生命周期:Servlet从创建到销毁的过程. 何时创建:用户第一次访问Servlet创建Servlet的实例 (单实例) 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候. Servlet规范规定,所有的servlet必须实现 javax.servlet.Servlet接口。 1.第一次调用时,将执行初始化方法:init(ServletConfig) 2.每一次调用,都将执行service(ServletRequest,ServletResponse)方法 3.服务器关闭,或项目移除:destroy()方法 JavaEE规范中提供Servlet接口实现类: GenericServlet:通用servlet实现。没有实现service HttpServlet:与Http协议有关的实现。实现service方法,完成与http协议有关的操作。 request.getMethod() 获得请求方式(get、post) 如果是get,将调用doGet() 如果是post,将调用doPost() servlet被访问过程描述 1. 用户第一次访问Servlet的时候,首先服务器会创建一个Servlet的实例 2. 创建servlet实例同时执行Servlet的init方法。 3. 然后,每一次请求服务器都会创建一个新的线程访问Servlet中的service的方法,在service方法内部根据请求的方式的不同调用doXxx的方法(get请求调用doGet,post请求调用doPost)。 4. 当Servlet从服务器中被移除,或者关闭服务器,Servlet的实例就会被销毁,同时destroy方法将会执行。 Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置: 在web.xml中在<servlet></servlet>标签中配置: * <load-on-startup>2</load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高. url-pattern配置方式共有三种: 1.完全路径匹配 :以 / 开始 例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6 2.目录匹配 :以 / 开始 需要以 * 结束. 例如: /* (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/* 3.扩展名匹配 :不能以 / 开始 以 * 开始的. 例如: *.do , *.action 、*.jsp 、*.jpg ***** 错误的写法 : /*.do 4.缺省路径 / 通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet tomcat获得匹配路径时,优先级顺序:1 > 2 > 3 > 4 有如下的配置: <servlet> <servlet-name>ServletDemo4</servlet-name> <servlet-class>cn.com.javahelp.a_servlet.ServletDemo4</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo4</servlet-name> <url-pattern>/ServletDemo4</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo5</servlet-name> <servlet-class>cn.com.javahelp.a_servlet.ServletDemo5</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo5</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo6</servlet-name> <servlet-class>cn.com.javahelp.a_servlet.ServletDemo6</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo6</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 如果访问地址: http://localhost:8080/day13/ServletDemo4 :第一个 http://localhost:8080/day13/aaa.do :第二个 ***** 完全路径匹配 > 目录匹配 > 扩展名匹配 相对路径:都是需要找位置相对关系.不能以 / 开始的. * ./ 当前路径 ../上一级目录 * 使用相对路径访问: * http://localhost:8080/day13/demo4-url/demo1.html * http://localhost:8080/day13/ServletDemo6 绝对路径:不需要找位置相对关系. 以 / 开始的. * 绝对路径中分为客户端路径和服务器端路径: * 客户端路径一定要加工程名. /day13/ServletDemo6 * 服务器端路径不需要加工程名. /ServletDemo6 方法名 返回值类型 描述 getInitParameter(name) String 获得Servlet的初始化参数的 getInitParameterNames() Enumeration 获得所有Servlet的初始化参数的名称 getServletContext() ServletContext 获得ServletContext对象的引用 getServletName() String 获得Servlet在web.xml中配置的name的值。 及<servlet-name>标签配置内容。 servlet的初始化参数 |
|