Servlet服务学习(中篇)

Servlet

作用:Servlet主要用于处理浏览器端发送的Http请求,并返回一个响应

一:注册Servlet

pom.xml中设置,浏览器是提供这个URL地址访问web资源的,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用元素和元素完成。

<servlet>
<servlet-name>ServletName</servlet-name>  给该资源起个名
<servlet-class>com.qfedu.servlet.HelloServlet</servlet-class>  指定的该资源的路径 
</servlet>
<servlet-mapping>
<servlet-name>ServletName</servlet-name>  和上面的名字一直
<url-pattern>/hello</url-pattern>
</servlet-mapping>


元素用于注册Servlet,它包含有两个主要的子元素:

: 设置Servlet的注册名称

: 设置Servlet的完整类名,包名+类型形式

元素用于映射已注册的Servlet的对外访问路径,它包含有两个子元素:

:Servlet的注册名称,必须和配对的中的相同

:设置访问该Servlet资源的路径

例如,访问:http://localhost:8080/test/hello时,

Tomcat服务器截取到访问的资源名称/hello,

先从web.xml的中找匹配的url,找到后,再查找对应的;

然后从节点中找匹配的,找到后,根据的类名,创建Servlet对象,执行其中的方法

以上作为了解,以为后面我们直接使用注解的方式,就可以把复杂的xml文件代替了。

@WebServlet注解方式

注解中使用主要属性:

属性名
nameServlet名字,可以自定义
value访问Servlet资源时匹配的路径,和urlPatterns互斥
urlPatterns允许当前Servlet有多个匹配方式,和value互斥
loadOnStartup标记容器是否启动时加载该Servlet
initParams当前Servlet的初始化配置WebInitParam 注解类型 ,属性包括name和value
// 注解实现的方法
@WebServlet(name = "HelloServlet", value = "/HelloServlet")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("get hello");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("post hello");
    }
}

后期网页的表单信息提交就可以使用直接发送到HelloServlet这个服务上,来接收前端页面的数据

Servlet 接口中的主要方法:

方法
void init(ServletConfig config)初始化Servlet
void service(ServletRequet req, ServletResponse res)负责响应客户端请求
void destroy()销毁servlet对象,用于释放资源等
ServletConfng getServletConfig()获得Servlet 的相关配置信息,该方法会返回一个指向ServletConfig的引用
java.lang.Sring getServletInfo()获得Servlet开发者定义的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7hhgfY8W-1680530909190)(D:\前锋学习笔记\笔记\image.png)]

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

request和response对象即然代表请求和响应,如果要获取客户机提交过来的数据,只需要找request对象。要向客户端输出数据,只需要找response对象。

HttpServletRequest接口

HttpServletRequest接口继承了ServletRequest接口

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象中的方法,可以获得请求相关信息。

主要学习get() 方法 post() 方法

1)get方式 了解

//读取get方式提交的数据
//获取请求参数
//如果参数中有中文,name=%E5%BC%A0%E4%B8%89&password=123
String queryString = request.getQueryString();
//中文乱码问题
queryString = URLDecoder.decode(queryString, "utf-8");

System.out.println(queryString);

2)post方式 了解

//读取post方式提交的数据
ServletInputStream inputStream = request.getInputStream();
byte[] buff = new byte[1024];
int len = inputStream.read(buff);

String string = new String(buff, 0, len);
string = URLDecoder.decode(string, "utf-8");
System.out.println(string);
  1. 上面两种方法非常复杂。
//根据表单中输入控件的name属性值,获取表单参数
//get和post方式都可以用该方法获取表单参数
//tomcat8下,get方式下,使用getParameter方法,中文不会乱码


String name = request.getParameter("name");
String pwd = request.getParameter("password");

System.out.println(name);
System.out.println(pwd);

HttpServletResponse

HttpServletResponse对象服务器的响应。该对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法

方 法说 明
PrintWriter getWriter()返回Servlet引擎创建的字符输出流对象
void addCookie(Cookie cookie)将指定的Cookie加入到当前的响应中
void addHeader(String name,String value)将指定的名字和值加入到响应的头信息中
String encodeURL(String url)编码指定的URL
void sendRedirect(String location)重定向,发送一个临时的响应到客户端
void setHeader(String name,String value)将给出的名字和值设置响应的头部
void setStatus(int sc)给当前响应设置状态码
void setContentType(String ContentType)设置响应的MIME类型

乱码处理

出现乱码的原因:不做任何处理时,返回的数据使用了iso-8859-1的编码,而该编码方式不支持中文,所以中文显示"???"。

response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html");

注意:如果仅使用response.setCharacterEncoding(“utf-8”),还是会显示乱码。这是由于虽然返回内容使用了utf8编码,但是浏览器加载的页面使用的是gbk编码,所以还需要设置content-type响应头。

response.setContentType("text/html;charset=utf-8");

转发和重定向

一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。

请求转发属于服务器行为

转发需要通过RequestDispatcher 接口的对象,调用 ServletRequest 的 getRequestDispatcher(String path) 方法可以获取该对象

方法功能描述
void forward(ServletRequest request,ServletResponse response)用于将请求转发给另一个 Web 资源。该方法必须在响应提交给客户端之前被调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c9bcrUor-1680530909191)(D:\前锋学习笔记\笔记\11105U1R-0.png)]

//request域
request.setAttribute("age", 10);
//转发
request.getRequestDispatcher("/ForwardServlet2").forward(request, response);

重定向

一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

重定向属于客户端行为。本质上是两次 HTTP 请求,对应两个 request 对象和两个 response 对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7mm3PpJJ-1680530909191)(D:\前锋学习笔记\笔记\112RMB0-0.png)]

//重定向
//response.sendRedirect("/W08_2_Servlet/RedirectServlet2");
//response.sendRedirect("RedirectServlet2");

//重定向时,不能共享request对象中的数据
request.setAttribute("id", 100);
//推荐如下写法
response.sendRedirect(request.getContextPath() + "/RedirectServlet2");

重定向时,多个Servlet不能共享request对象中的数据

重定向和转发区别

1)重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变;转发过程结束后,浏览器地址栏保持初始的URL地址不变。

2)重定向时,通过响应的结果告诉浏览器去重新发出请求访问另外一个资源;而转发是在服务器端内部将请求转发给另外一个资源。

3)转发时,调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而重定向时调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

4)重定向时,重定向的URL以“/”开头,它是相对于WEB应用所在的服务器;转发时的URL以“/”开头,它是相对于当前WEB应用程序。

5)转发只能将请求转发给同一个WEB应用中的资源;而重定向还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

区别转发重定向
行为服务器行为客户端行为
浏览器地址栏 URL 是否发生改变
是否共享 request 对象和 response 对象
是否能通过 request 域对象传递数据
是否支持跳转到其他应用的资源
路径中/相对于当前web应用相对于服务器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二手Java程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值