本文共 7872 字,大约阅读时间需要 26 分钟。
在前端页面中,网络中用户对后台输入的请求,后台必须理解其用户的需要并且将这个请求分配对应的处理类。
(1) Servlet(Server Applet),全称Java Servlet。是⽤Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,⽣成动态Web内容。其中,⼴义的Servlet 是指任何实现了这个Servlet接⼝的类,将Servlet理解为后者更为确切。
(2) Servlet运⾏于⽀持Java的应⽤服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝⼤多数情况下Servlet只⽤来扩展基于HTTP协议的Web服务器。
(3) Servlet⼯作模式: ① 客户端发送请求⾄服务器 ② 服务器启动并调⽤Servlet,Servlet根据客户端请求⽣成响应内容并将其传给服务器 ③ 服务器将响应返回客户端。
在搭建Tomcat的基础上(Tomcat搭建方法请参照我前面的博客)后,进行如下操作即可。
在lib中,设置为Provided,运行调用时方便使用。
package web;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.SyncFailedException;public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post"); }}
在上面的Demo中,我们继承其对象后,重写doget()
和dopost()
方法(Ctrl+o),创建了一个Servlet的继承类。
不同的对Servlet使用,一般采用的方法不一。如下图展示的是在进行不同的调用时所采用的方法。
$Title$ 这是我的第一个项目
web.xml
文件中打入如下代码a1 web.servletdemo1 a1 /test //注意上面要加上/test,没有斜杠服务器会报错滴。这是因为此时在请求地址。
public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post"); }}
其结果大致如下。
每当点击按钮时,在IDEA下面会出现post的响应。
生命周期部分主要以如上图片展开。
Service()
方法,由Service()
判断客户端的请求方式。处理方式完成后,作出相应的结果返回给客户端,单词请求处理完毕。init()
方法,而是直接调取Service()
方法。destroy()
方法进行销毁。在第5点所表达的生命周期,请求和响应是其中两个很重要的对象。service()
会判断客户端的请求方式,如果是请求方式,则调用doGet()
;如果是响应方式,则调用doGet()
。
String getParameter(String name)
String
**【实例1】**通过调用doGet()
方法获取用户名和密码
--index.jsp--web.xml这是我的第二个项目
点击我!
返回结果如下:点击<a>点击我!</a>
后,IDEA会收到其中的信息。
而后,在输入框中输入仍意如下图所示,IDEA也会返回值过来。
第一个是输入123后的输出返回,第二个由于输入中文字符会产生乱码(doGet不会出现中文乱码的问题,在Tomcat8后已经解决了该问题)。
此时在重写的doPost()后面第一行再添加如下代码即可支持中文。
req.setCharacterEncoding("utf-8");
String[]getParamenterValues(String name)
**【实例】**接下来试着用上面的方法
兴趣爱好:篮球 足球 游泳
String[] Hobby=req.getParameterValues("hobby"); for (String interest:Hobby){ System.out.println(interest); } System.out.println("That is all!");
doPost()
中添加如上代码。最后的调试运行后,选择篮球和足球后,会发生后面的事情。
basketballfootballThat is all!
getRequestDispatcher(String path)
该方法最主要在重写方法中写入,运行编译后可跳转某一个界面。
例如在Web下写入一个test.html,跳转如下。
req.getRequestDispatcher("/test.html").forward(req,resp);//首先前的调用调动资源自动找到/test.html//后面的forward(req,resp)可以理解成模板,即就是这么写的
存值:request.setAttribute("key",value);
取值:request.getAttribute("key");
//示例: String a1=(String)request.getAttribute("uname")
void addCookie(Cookie var1);
void sendRedirect(String var1);
发送一条响应码,将浏览器跳转到指定位置。
【示例】
resp.sendRedirect(s:"/my.html") //跳转resp.setContentType("text/html") //响应的内容可以是文本,也可以是html页面resp.addCookie();//设置cookie值存储胡PrintWriter writer = resp.getWriter();//得到一个给前端输出信息的输出流对象
在第6点的讲解时,同时对Request
和Response
中进行跳转页面的方法介绍。
其中,使用req.getRequestDispatcher()
方法称为转发;使用resp.sendRedirect(s:"/my.html")
称为重定向。
两者的区别如下:
path
,后者方法内部是String
。会话的出现在于,每当进行请求的时候,由于是一次请求一次响应,在进行多次请求时就需要调用多次Request
。并且Request
存值只能在单次请求时保存,并且加上一次请求一次响应的特性,所保存的数据无法跨页面。所以在请求时会出现一些麻烦。
会话的出现使得其能包含若干个request
,并且能够在多个页面上共享。
会话:例如用户打开浏览器到关闭浏览器,期间访问服务器的过程称为一次会话。
void setAttribute(String key,Object value)
以key/value的形式保存对象值,将数据存储在服务器端
Object getAttribute(String key)
通过key获取对象值
void invalidate()
设置session对象失效
String getId()
获取session中的id,当第一次登录成功后,session会产生一个唯一的id。浏览器之后的访问时如果当前id值等于前面的id,说明此时访问的是同一个会话。
void setMaxInactiveInterval(int interval)
设定session的⾮活动时间。具体表现在登录一段时间未进行任何操作,就要进行重新登陆。此时就是设定了非活动时间。
【示例】比如在重写的doPost()
中使用其中的方法
HttpSession session=req.getSession(); //首先返回一个session对象session.setAttribute("k1","aaa"); //使用session对象进行存储对象session.getAttribute("k1"); //取出来session.removeAttribute("k1"); //删除掉String id=session.getId(); //获取会话id值System.out.println(id); //输出id
在前面的示例的基础上,同样的编译运行调试过程。
运行结果如下所示。
5519672D144FBDC3D581A935670C765F小艾扶basketballfootballswimmingThat is all!11-Jun-2021 09:34:29.874 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Program Files\Java\apache-tomcat-8.5.34\webapps\manager]11-Jun-2021 09:34:29.925 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Program Files\Java\apache-tomcat-8.5.34\webapps\manager] has finished in [50] mspost5519672D144FBDC3D581A935670C765F小艾扶basketballfootballswimmingThat is all!
同样的,可以将之前写的示例代码删掉,只留下上面刚刚重写的方法进行示例展示也可以。
【补充】session失效的方式
invalidate()
removeAttribute("key")
初始化参数主要在于维护上面的灵活使用。在针对前面的示例中,我们使用过req.setCharacterEncoding("utf-8");
。虽然在现阶段的使用没有出现太多问题,但是在后续的学习上必然需要进行更严谨的设置。
1.web.xml
中定义初始化参数
encoding utf-8
2.servlet中获取初始化参数方法。
public void init(ServletConfig config) throws ServletException { encoding= config.getInitParameter("encoding");//在前面的xml文件设置时添加的,将其获取出来 sout~//输出上面的代码即可}
注意:这种⽅式的初始化参数仅限于当前servlet中使⽤。
实现方式2:全局初始化配置参数
1.在xml文件上同样添加以下代码
bianma utf-8
此时不同的是,该标签是跟Servlet标签同等级的。所以进行插入时记住这一点。
2.获取数据
public void init(ServletConfig config) throws ServletException { bianhao=config.getServletContext().getInitParameter("bianma"); //获取Context标签下的param-value信息 System.out.println(bianhao);
了解Servlet3.0,首先了解注解和注释的含义。
**注解:提供给程序进行读取的信息。**比如@Override
注释:提供给程序员看的信息。
【实例如下】
@WebServlet(urlPatterns="/stu/test",name="myname",initParams={ @WebInitParam(name="init-stu",value="myinitparams") //设置初始化参数},loadOnStartup=1)init()//重写方法一下以便测试
以上是Servlet的大致学习内容,请大家批评指正~
转载地址:http://xegdi.baihongyu.com/