java web基础之servlet

2024-09-04 03:58
文章标签 java 基础 servlet web

本文主要是介绍java web基础之servlet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



JavaServlet基本概念

       Java Servlet是一个专门用于编写网络服务器应用程序的Java组件。所有基于Java的服务器端编程都是构建在Servlet之上的。在J2EEServlet已经是一个标准的组件。

在J2EE中所属包:javax.servlet

1)Servlet 是顶层接口。
2)GenericServlet 是继承Servlet与协议无关的类。
3)HttpServlet 是继承GenericServlet并实现HTTP协议相关的类。

servlet引擎

        Servlet引擎一般是第三方的插件,它通过一定的方法连接到Web服务器,Servlet引擎把它识别为Servlet请求的那些HTTP请求截获下来处理,而其他的HTTP请求由Web服务器按照通常的方式来处理,Servlet引擎会装载合适的Servlet到内存中,如果Servlet还没有运行的话,会分配一个可以使用的线程来处理请求,再把Servlet的输出返回到发出请求的Web客户机。

        Servlet运行于Servlet引擎管理的Java虚拟机中,被来自客户机的请求所唤醒,与CGI不同的是,在虚拟机中只要装载一个Servlet就能够处理新的请求,每个新请求使用内存中那个Servlet的相同副本,所以效率比CGI来得高。

Servlet的生命周期

       在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:
1)init()初始化。
2)service()处理请求。
3)destroy()当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中所分配的资源。

注意对于servlet具体的实现,如HttpServlet其service服务将根据请求的方式调用doPost()或doGet()方法。(此外:doHeader 、doPutdoDelete等也是)

在使用这些方法时必须带两个参数。第一个包含来自客户端的数据HttpServletRequest。第二个参数包含客户端的相应HttpServletResponse。

public class MsgServlet extends HttpServlet {  
02.    /** 
03.     * 请求是get方式 
04.     */  
05.    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{  
06.        //设置相应的类型为text/html  
07.        response.setContentType("text/html");   
08.        //对于get方式 获取请求文本参数的方法 getParameter(对应的键)  
09.        String parameValue=request.getParameter("parameKey");  
10.        //对客户端请求的数据进行操作  
11.        System.out.println(parameValue);  
12.          
13.        //从HttpServletResponse得到输出流  
14.        PrintWriter out = response.getWriter();   
15.        //向客户端打印HTML文本  
16.        out.write("<div>html格式响应文本</div>");   
17.          
18.        //输出并关闭流  
19.        out.flush();  
20.        out.close();  
21.    }  
22.    /** 
23.     * 请求是post方式 
24.     */  
25.    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{  
26.        //post的操作基本与get方式一致 但post不仅能传递文本 还能传递二进制流  
27.        InputStream io=request.getInputStream();  
28.        BufferedReader br=new BufferedReader(new InputStreamReader(io));  
29.        String line,reslult="";  
30.        while((line=br.readLine())!=null)  
31.            reslult+=line+"\n";  
32.        System.out.println(reslult);  
33.        io.close();  
34.        //其他操作……  
35.    }  
36.}  

Servlet配置

在web.xml中配置servlet以便客户端进行访问:

<servlet>  
02. <!-- servlet名称 -->  
03. <servlet-name>msgServlet</servlet-name>  
04. <!-- servlet对应的类 -->  
05. <servlet-class>com.linxcool.servlet.MsgServlet</servlet-class>  
06.</servlet>  
07.<servlet-mapping>  
08. <!-- servlet名称 -->  
09. <servlet-name>msgServlet</servlet-name>  
10. <!-- 访问的URL地址 -->  
11. <url-pattern>showMsg</url-pattern>  
12.</servlet-mapping>  


Servlet会话控制

        Session的发明是为了填补HTTP协议的局限。请注意HTTP协议的工作方式:
用户发出请求,服务器作出响应,这种用户端和服务器端的联系就是离散的,非连续的。HTTP协议不能提供允许服务器跟踪用户请求的功能。
在服务器端完成响应用户的请求之后,服务器不能继续与该浏览器继续保持连接。
从服务器这端来看,每一个请求都是独立的,因此HTTP协议被认为是无状态协议,当用户在多个主页间切换时,服务器无法知道他的身份。

        Session的出现就是为了弥补这个局限。利用Session,您就可以当一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做的事情就变得简单多了。在访问者从到达某个特定的主页到离开为止的那段时间,每个访问者都会单独获得一个Session。
  Java Servlet定义了一个HttpSession接口,实现的Session的功能,在Servlet中使用Session的过程如下:

1)使用HttpServletRequest的getSession方法得到当前存在的session,如果当前没有定义session,则创建一个新的session,还可以使用方法getSession(true)
2)写session变量。可以使用方法HttpSession.setAttribute(name,value)来向Session中存储一个信息。也可以使用HttpSession.putValue(name,value),但这个方法已经过时了。
3)读Session变量。可以使用方法HttpSession.getAttribute(name)来读取Session中的一个变量值,如果name是一个没有定义的变量,那么返回的是null。需要注意的是,从getAttribute读出的变量类型是Object,必须使用强制类型转换,比如:String uid = (String) session.getAttribute("uid");也可以使用HttpSession.getValue(name),但是这个方法也已经过时了。
4)关闭session,当时用完session后,可以使用session.invalidate()方法关闭session。但是这并不是严格要求的。因为,Servlet引擎在一段时间之后,自动关闭seesion。

//参数true是指在没有session时 创建一个新的session  
02.HttpSession session = request.getSession(true);  
03.//得到session对象创建的时间  
04.Date created = new Date(session.getCreationTime());   
05.//得到该session的id,并打印  
06.out.println("ID " + session.getId()+"<br>");   
07.//打印session创建时间  
08.out.println("Created: " + created+"<br>");  
09.//在session中添加变量UID=12345678  
10.session.setAttribute("UID","12345678");   
11.//在session中添加变量Name=Tom  
12.session.setAttribute("Name","Tom");    

Servlet页面请求

1)直接定位,效率较低,首先返回请求页面,然后请求新的页面
response.sendRedirect("URL地址");

2)请求分发方式,效率较高,直接在服务端寻找并返回新页面
RequestDispatcher dispatcher=request.getRequestDisPatcher("URL地址");
控制权不转移:
dispatcher.include(request,response);
控制权转移:
dispatcher.forward(request,response);

乱码问题

post方式提交,设置默认是UTF-8编码
所以只要在doPost方法内添加如下代码即可解决乱码问题:
request.setCharacterEncoding("UTF-8");


get方式提交,设置默认是UTF-8编码
所以只要在doGet方法内添加如下代码即可解决乱码问题:
new String(<处理的字符>.getBytes("ISO-8859-1"),"UTF-8");




这篇关于java web基础之servlet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134936

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2