Java学习笔记之:Servlet写法
一、编写servlet
1.编写servlet我么需要继承HttpServlet(一个java类,提供了servlet的接口方法)
public class HelloServlet extends HttpServlet
2.HttpServlet提供了:init():初始化服務器, doget()&&dopost():处理请求的方法,destroy():销毁的方法。
public class HelloServlet extends HttpServlet { /** *
* 1.servlet 的初始化方式init()方法的执行
* a.在用户第一次发起请求的时候执行init()方法。方法只会执行一次
* b.在web.xml文件中配置<load-on-startup>1</load-on-startup>,init()方法会在服务器
* 启动的时候执行。load-on-startup 的值为0-9的任意值,值的大小不具备任何含义,只有值本身有一定
* 的语义.表示如果配置了值就是在服务器启动的时候执行init()方法.init()方法同样的只会执行一次.
* c.在服务器启动的时候执行init()方法,并且进行参数的传递,那么执行的是init()的方法重载.
*/ @Override public void init() throws ServletException { System.out.println("init"); } /** * get方式请求 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("do get"); // 返回页面的方法 req.getRequestDispatcher("main.jsp").forward(req, resp); } /** * post方式请求 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("do post"); // 返回页面的方法 req.getRequestDispatcher("main.jsp").forward(req, resp); } /** * 销毁服务 */ @Override public void destroy() { System.out.println("destroy"); } }
3.配置web.xml文件:是连接页面和服务器端之间的桥梁
<!-- servlet的配置文件的配置要求 1.servlet和servlet-mapping节点的子节点servlet-name要是对应的。 2.servlet-class指向的是目标servlet的java类的全路径 3.url-patern负责过滤页面传来的请求是否通过,匹配页面的请求url --> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.hgd.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet>
4.编写页面的请求:见index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <p>servlet页面的写法</p> <!-- herf的值就是请求的url,默认的就是get方式--> <a href="hello?user=admin&pwd=123">这是一个超链接</a> <hr> <!-- get方式post方式的区别 : 1.get方式会将参数加到请求url后面进行参数传递,post方式是通过post机制来进行参数传递。 2.get方式是用来获取数据,post是发送数据 3.get传输速度比较快,二数据传输大小最大是4k,post传输速度比较慢,可以传输的数据大小理论上没有限制,会因为操作系统的不同有所限制 4.get的安全性比比较低,post安全性比较高 --> <!-- 请求的方法是get,action的值要和web.xml文件中url-pattern节点的text值相同 --> <form action="hello" method="get"> <button type="submit">doget</button> </form> <hr> <!-- 请求的方法是post,action的值要和web.xml文件中url-pattern节点的text值相同 --> <form action="hello" method="post"> <button type="submit">dopost</button> </form> </body> </html>
5.编写返回页面
<body> This is my JSP page. <br> <%-- <% 代码 %> 可以编写java代码 <%=输出的内容 %> =后面的内容表示输出到页面 --%> <% //request:是内置对象,不需要声明的可以直接使用 Object obj = request.getAttribute("msg"); if (obj != null) { %> <p style="color: red;"> <%=obj.toString()%> </p> <% } %> </body>
6.在doget或dopost方法中编写指定返回页面
// 返回页面的方法 req.getRequestDispatcher("main.jsp").forward(req, resp);
二、servlet的声明周期
当用户从视图层发起一个request请求,那么这个请求将通过web.xml文件,来进行比对 ,如果请求的url
能被通过。那么将通过web.xml文件中的<servlet-name>这个节点找到对应的servlet如果请求方式是
get那么将执行doget方法,请求方式是 post那么将执行dopost方法,在用户第一次请求的时候执行init
方法,在服务器关闭的时候 执行destroy方法,如果在web.xml文件中配置了
<load-on-startup>0</load-on-startup>,那么init方法将在服务器启动的时候执行,当init()
方法和init(ServletConfig config)同时被重写的 时候,将会调用init(ServletConfig config)
方法。这个方法可以在服务器初始化的时候进行参数的传入。
三、servlet执行流程
1.用户从页面发起一个请求
2.请求通过web.xml文件找到对应的url-pattern,根据servlet-name的text值找到对应的servlet
-class,通过反射来创建servlet对象,如果请求是get方式,那么将执行doget(),
如果请求是post方式,那么将执行dopost()方法。
3.在执行目标方法后通过req.getRequestDispatcher("main.jsp").forward(req, resp);返回给用户对应的页面
四、实例
1.web.xml
<servlet> <servlet-name>user</servlet-name> <servlet-class>com.hgd.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping>
2.login.jsp
<body> <form action="user" method="get"> <input name="user"> <input name="pwd"> <button type="submit">doget</button> </form> <%-- <% 代码 %> 可以编写java代码 <%=输出的内容 %> =后面的内容表示输出到页面 --%> <% //request:是内置对象,不需要声明的可以直接使用 Object obj = request.getAttribute("msg"); if (obj != null) { %> <%=obj.toString()%> <% } %> <hr> <form action="user" method="post"> <input name="user"> <button type="submit">dopost</button> </form> </body>
3.main.jsp
<body> This is my JSP page. <br> <%-- <% 代码 %> 可以编写java代码 <%=输出的内容 %> =后面的内容表示输出到页面 --%> <% //request:是内置对象,不需要声明的可以直接使用 Object obj = request.getAttribute("msg"); if (obj != null) { %> <p style="color: red;"> <%=obj.toString()%> </p> <% } %> </body>
4.UserServlet.Java
/** * * 1.页面的请求可以有两中写法 form表单 a超链接 * 2.超链的写法 * 详细见index.jsp * 3.get和post请求方式的区别: * 详细见index.jsp * 4.request传值: * 页面和服务器端之间的数据传输是通过HttpServletRequest这个对象来完成 * 4.1:从页面向服务端传输数据 * 页面传来的数据格式为 key=value * 可以在目标方法中通过getParameter(key),来获取到页面传递的数据,默认的 * 都是String类型 * 超链传递参数可以将参数直接加入到url上面hello?user=admin&pwd=123 * 4.2:服务器端向页面传递参数 * 通过HttpServletRequest对象进行传递 * 通过request.setAttribute(key,value)方法,在页面可以通过 * request.getAttribute(key)方法来获取值,传递值的类型是Object,在 * 获取到数据后需要进行数据类型转换 * 详细包含index.jsp和main.jsp * * */ public class UserServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("init"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); // 获取页面传输过来的数据:默认的都是字符串 String username=req.getParameter("user"); String password=req.getParameter("pwd"); System.out.println("doget:"+username+password); String result = "";// 登陆是否成功的返回提示 if ("admin".equals(username) && "123".equals(password)) { result = "你的账号密码正确的,可以可以访问"; req.setAttribute("msg", result);//服务器端向页面传递参数 req.getRequestDispatcher("main.jsp").forward(req, resp); } else { result = "你的账号密码不对,你不可以访问"; req.setAttribute("msg", result);//服务器端向页面传递参数 req.getRequestDispatcher("login.jsp").forward(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"); } @Override public void destroy() { System.out.println("destroy"); } }
本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/5964378.html,欢迎加入qq群927460240学习讨论

浙公网安备 33010602011771号