Servlet基础学习

什么是Servlet?

Servlet是一种用于接收web网页传回和输出到web的一个Java类,根据不同的实际需要,实现不同的Servlet来对网页数据进行处理。

Servlet的基本处理流程

在网页发起请求之后,编译器首先去寻找web网页的配置文件,在配置文件中指定该请求网页对应的Servlet类,以此建立连接,随后进行相应地数据操作

如何配置Servlet和web网页相互对应?

  1. 首先创建相应的Servlet类,继承servlet.jar中的HttpServlet,并在其中实现doPost或者doGet方法
  2. 在web项目中的WEB-INF文件夹下找到web.xml文件,在其中添加
    <servlet>
    <servlet-name>AddServlet(类名)</servlet-name>
    <servlet-class>Servlet类的相对路径</servlet-class>
    </servlet><servlet-mapping>
    <servlet-name>AddServlet(和上述的类名保持一致)</servlet-name>
    <url-pattern>/add(发送请求的action)</url-pattern>
    </servlet-mapping>


    这里我是拿来举例子,实际上的类名根据需要填写,但是格式差不多。一个servlet可以对应多个servlet-mapping

  3. 执行的顺序是:首先查看url-pattern,定位到用户发送的请求action相同的url-pattern,随后找到和servlet-mapping中的servlet-name相同的servlet中的servlet-name,再根据servlet-class路径找到对应的类来处理数据,最后根据用户选择的method方法选择调用doPost还是doGet方法

如何解决Servlet中Post方法的中文乱码问题?

Servlet类中有两类参数,一类是request,用于包含用户传过来的所有信息,一类是response ,用于响应web网页,传回数据给web。

处理数据都是用request,在request中有设置post下的编码方法:request.setCharacterEncoding("UTF-8");

注意:这个方法必须放在获取数据之前,最好放在doPost方法内的第一行

通过id获取数据:request.getParament("id");

Servlet的继承关系

HttpServlet->GenericServlet->Servlet

Servlet核心方法:

  • init()---初始化
  • service()---服务方法--重点
  • destroy()--销毁

在服务方法中,当有请求过来的时候,service方法会自动响应,(其实是Tomat调用),在HttpServlet中分析到底是哪种请求,get ,post,head等等。再决定调用哪种do方法,默认在HttpServlet中用405的实现风格,若是没有请求对应的do方法就会报错405

Servlet生命周期

默认情况下:

第一次接受请求的时候,当前的Servlet才会实例化并初始化,并且一个Servlet只会被实例化一次;

从第二次请求开始就是服务;

只有在容器被销毁,也就是Tomat关闭的时候会被销毁。

可以在<servlet>中使用<load-on-startup>标签设置启动的顺序,越小启动的时机越靠前,最小数字设置为0。这样就可以在请求的时候缩短第一次请求时间,只是启动容器需要花费多一点时间而已。

Servlet是单实例的,所以它是线程不安全的。最好不要在Servlet中定义成员变量的值

HTTP协议

HTTP请求

请求行

包含请求方式,访问地址url,HTTP协议版本

请求头

包含很多客户端信息需要告诉服务器的内容,如浏览器版本,文本,我能接收的类型

请求主体

get方式,没有请求体,但有一个queryString

post方式,有请求体,form data

json格式,有请求体,request payload

响应

响应也有三部分:响应行,响应头,响应体

响应行包含三个信息:协议,响应状态码,响应状态

响应头:包含服务器信息和服务器发送给浏览器的信息

响应体:响应的具体内容

Session会话跟踪技术

解决的问题:当服务器无法判断两个请求是否是同一个客户端发过来的,还是不同客户端发过来的,这称为HTTP的无状态问题

通过

request.getSession(/true/false);(第一种和第二种参数效果相同,第三种参数若没有Session会返回null并不会创建新的Session)方法来创建一个Session或者获取一个Session,当Servlet第一次发请求的时候,由于客户端此时没有Session,服务器会给他创建一个Session,在下一次的请求时客户端会将这个Session的ID号一起发送给服务端,这样就可以让服务端识别出来这次的请求时哪个客户端发送的。

  • session.getId()--获取SessionID
  • session.isNew()--判断当前的session是否是新的
  • session.getMaxInactiveInterval()--获取会话持续最大时间

Session的作用域:每一个session都会在服务器端有一个专门的容器来保存数据,根据SessionID来区分是哪个session的作用域。

服务器端内部转发请求和客户端重定向

  • 内部转发:(一次请求过程)request.getRequestDispatcher("要转到的页面名字").forward(request,response);
  • 重定向:302(两次请求过程)response.sendRedirect("...");      

Mybatis

什么是Mybatis?

是一种用于简化JDBC操作的持久层框架

Mybatis基本配置

Mybatis中的核心是两个配置文件,一个是SqlSessionFactory实例,我们一般通过xml文件进行配置,在这个文件中填写连接数据库的基本信息和映射文件。

 <mappers>
<!--    加载映射文件,这个映射文件里面包含了各种sql操作,需要自己写出来之后把这个文件路径放在这里,这样就可以在java代码中调用了--><mapper resource="JobsMapper.xml"/>
</mappers>

 这个例子中的mappers标签中写的就是映射文件

第二个核心文件就是这个映射文件,这个映射文件中封装着各种sql语句,用于数据库查询等操作。一般而言,一个表对应一个映射文件。在映射文件中也有着mapper标签,这个标签中存放具体的sql语句,其中,namespace代表命名空间,包名类似,而这个Id代表这条语句的名称,也是sql语句的唯一标识符,这代表这个Id不可以重复。而resultType表示返回的类型,也就是你需要把从数据库拿来的数据包装成什么样子,一般而言都是建立一个java类来封装这些数据,所以这里需要填的一般都是java类的相对路径。

<mapper namespace="test"><select id="selectALL" resultType="com.mybatis_first.Jobs">select * from jobs;</select>
</mapper>

如何使用?

注意,在maven项目中要导入mybatis的jar包

//        第一步加载mybatis的核心配置文件String resource="mybatis-config.xml";InputStream resourceAsStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//        第二步,获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();
//        第三步,执行sqlList<Object> list = sqlSession.selectList("test.selectALL");System.out.println(list);sqlSession.close();

 Mapper代理开发技术

解决的问题

在上述的mybatis开发中,不难发现代码中存在硬编码的问题,也就是用字符串写出所需操作再获取对应的结果。事实上这在后期写代码的时候是非常不方便的,并且在维护过程中也很难处理,所以出现了Mapper代理开发技术。只要使用这种技术,就可以把上述的字符调用方法的过程封装成一个接口,这个接口对应该sql对应的映射文件,也就是说我们可以通过这个接口来调用映射文件中的sql方法,解决了硬编码的问题,并且IDE的代码补全功能可以提示你有些什么方法,总之还是很方便的。

如何实现?

  1. 首先需要定义一个和映射文件同名的接口,并且要将接口和映射文件放在同一个目录下\
  2. 需要将映射文件中的命名空间改成接口名。
  3. 在接口中定义方法,方法名就是映射文件中的id,并且参数和返回值类型要保持一致

注意:在resources命名和java中一样的包结构时,需要使用  / 而不是  .  如com/mapper/Usemapper

<!--    在使用了Mapper代理的方式之后,就可以通过包扫描的方式加载映射文件了,不需要一个一个写    --><package name="com.mapper"/>

这个包是java包下的mapper接口包,在使用了mapper代理之后,只要扫描这个包就可以同时把这些接口绑定的包一起拉进来

Mybatis核心配置

  • <environments default="development">--这里代表的是数据库,可以通过切换不同的default来切换不同的数据库,并且可以连接多个数据库

  • <typeAliases>--用于给包下的类起别名,这样在配置resultType的时候就不用把报名也一起写出来了

    <typeAliases>
    <package name="...">
    </typeAliases>

    需要注意的是,在配置信息的时候,要遵循如下顺序

  •  介绍一个插件:MybatisX 这是一个帮助写mybatis的插件,效率还是挺高的,可以帮助我们在写接口方法的时候对应到映射文件里的Id。

但是数据库字段名称和实体类名称不一致的时候不能自动封装数据
解决方法:

  1. 起别名
  2. 使用sql片段
  3. resultMap--映射
 <resultMap id="JobResultMap" type="com.mybatis_first.pojo.Jobs">
<!--        id标签对应的是主键属性--><!--        <id column="" property=""></id>-->
<!--        result标签对应的是一般属性--><id column="job_id" property="jobId"/><result column="job_title" property="jobTitle"/><result column="min_salary" property="minSalary"/><result column="max_salary" property="maxSalary"/></resultMap><select id="selectALL" resultMap="JobResultMap">select * from jobs;</select>

Mybatis日志

日志就像是日记本一样,记录着程序在底层执行的时候的各种操作,学会分析日志能够帮助我们更好的了解程序的运行状态是否和我们的逻辑一致。

如何实现日志?

不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging。注意,在这种配置环境下,MyBatis 会把 Commons Logging 作为日志工具。这就意味着在诸如 WebSphere 的环境中,由于提供了 Commons Logging 的私有实现,你的 Log4J 配置将被忽略。这个时候你就会感觉很郁闷:看起来 MyBatis 将你的 Log4J 配置忽略掉了(其实是因为在这种配置环境下,MyBatis 使用了 Commons Logging 作为日志实现)。

如果你的应用部署在一个类路径已经包含 Commons Logging 的环境中,而你又想使用其它日志实现,你可以通过在 MyBatis 配置文件 mybatis-config.xml 里面添加一项 setting 来选择其它日志实现。

setting配置日志的有效取值(value的值)

    可选的值有: SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了 org.apache.ibatis.logging.Log 接口,且构造方法以字符串为参数的类完全限定名。而name要填写lohImpl

注意在使用上述值的时候要保证你有拉取到这些日志的Jar包。

具体的日志信息可以看以下的博客

https://blog.csdn.net/weixin_43715360/article/details/128227878?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168144519416782425160093%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168144519416782425160093&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-128227878-null-null.142^v83^insert_down1,239^v2^insert_chatgpt&utm_term=mybatis%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE&spm=1018.2226.3001.4187

 slf4j-log4j2日志框架具体实现步骤:

  • 首先在pom文件下拉取所需要的jar包,一个都不能少!
    <!-- slf4j日志门面 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!-- 引入slf4j对应log4j的桥接器 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><scope>runtime</scope><version>2.11.0</version></dependency><!-- log4j2日志实面(日志实现框架) --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><scope>runtime</scope><version>2.11.0</version></dependency><!--导入log4j2日志门面--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.13.3</version></dependency>
  • 然后去mybatis-config.xml文件中添加信息,需要注意一下标签的顺序(在上面有说)
    <settings><setting name="logImpl" value="SLF4J"/></settings>

如下给出一份log4j2.xml配置文件 ,有需要就拿去用吧

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30"><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/></console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--><File name="log" fileName="log/test.log" append="false"><PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --><DefaultRolloverStrategy max="20"/></RollingFile><RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息--><logger name="org.springframework" level="INFO"></logger><logger name="org.mybatis" level="INFO"></logger><root level="all"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers>
</configuration>

(网上信息都是散的,我看了好多好多博客才解决这个日志正常显示问题,不过也是看了不少博客,才明白这个日志还挺复杂,要学的东西挺多的,一点点来吧,真心希望我这个过程能够帮助刚入门了解日志的人先正常显示日志,不会一直报错)💕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react仿微信聊天室|react即时聊天IM系统|react群聊

reactredux仿微信聊天IM实战|react仿微信界面|react多人群聊天室 最近一直捣鼓react开发&#xff0c;就运用react开发了个仿微信聊天室reactChatRoom项目&#xff0c;基于reactreact-domreact-router-domreduxreact-reduxwebpack2.0antdesignwcPop等技术混合开发&#xff0c;实…

DES加密解密 Feistel算法网络结构 详讲

文章目录 简单知识导入&#xff1a;具体过程&#xff1a;IP置换&#xff08; 64 − > 64 64->64 64−>64&#xff09;轮函数--E扩展置换&#xff08; 32 − > 48 32->48 32−>48&#xff09;轮函数--与子密钥异或&#xff08; 48 − > 48 48->48 48−&…

2023年春秋杯网络安全联赛春季赛Reverse题目复现

文章目录 一.sum1. 分析程序逻辑2.解数独矩阵3.解题脚本 二.Poisoned_tea_CHELL1. 重新识别函数及程序逻辑分析2.IDA动态调试(attach附加调试)3. 输入选项进行单步调试4.解题脚本 BWBAOldSymbolicCode 一.sum 1. 分析程序逻辑 这里直接贴上当时分析的结果,根据程序行为不难猜…

NLP相关知识点(慢慢更新)

一、基础概念 1.1. NLP 中的 Tokenization 是什么? NLP技术中 Tokenization 也可以被称作是“word segmentation”&#xff0c;直译为中文是指 分词。 分词是NLP的基础任务&#xff0c;按照特定需求能把文本中的句子、段落切分成一个字符串序列&#xff08;其中的元素通常称…

SpringCould+Vue3-Element-Admin 登录接口,用户信息接口以及Token验证的实现【Taurus教育平台】

文章目录 一.SpringCouldVue3-Element-Admin 登录接口&#xff0c;用户信息接口以及Token验证的实现【Taurus教育平台】1.1 背景1.2 数据库 二、登录接口及其Token实现2.1 前端2.2 后端2.2.1 控制层2.2.2 service层2.2.3 工具类&#xff1a;CreateJwt2.2.4 Dao-Mapper 三、用户…

【Bert、T5、GPT】fine tune transformers 文本分类/情感分析

【Bert、T5、GPT】fine tune transformers 文本分类/情感分析 0、前言text classificationemotions 数据集data visualization analysisdataset to dataframelabel analysistext length analysis text > tokenstokenize the whole dataset fine-tune transformersdistilbert…

Django通过nginx 部署(成功运行)

配置python版本和ssh启用root参考其它文章 完整项目路径 /root/projects/mysutra_pro 下级目录/root/projects/mysutra_pro/mysutra是源码目录 rootVM-12-2-debian:~/projects/mysutra_pro# ls db.sqlite3 manage.py ms_env mysutra rootVM-12-2-debian:~/projects/mysutr…

es Elasticsearch的增删改查(含数组操作)(类型,原理) - from chatgpt

父文章 算法中的特征的保存, es 和 mysql 和 odps hadoop hbase的区别_个人渣记录仅为自己搜索用的博客-CSDN博客 Elasticsearch如何做到数十亿数据查询毫秒级响应&#xff1f; - 知乎 ES系列之利用filter让你的查询效率飞起来_es filter_lucasma.eth的博客-CSDN博客 ES查询…

文心一言对比chatgpt

文章目录 一、 介绍二、 回复速度比较三、 写代码能力四、 做表格能力五、 写文案能力六、 解决数学问题能力七、 绘画能力八、 实时更新信息九、 总结 一、 介绍 文心一言对比chatgpt。 测试了上百个案例&#xff0c;挑选几个经典的案例。 二、 回复速度比较 百度文心耗时10…

CSDN chatGPT初体验

我的问题&#xff1a;用java实现一个B树 public class BTree {private int t;private Node root;private class Node {private int n;private boolean leaf;private int[] keys;private Node[] children;public Node(boolean leafNode) {this.n 0;this.leaf leafNode;this.ke…

chatgpt赋能python:Python岗位需求日渐增加

Python岗位需求日渐增加 Python编程语言在当前的IT行业中越来越受欢迎。其灵活性和易用性使得Python在各种领域中使用广泛&#xff0c;比如Web开发、数据科学、人工智能等。作为一名有10年Python编程经验的工程师&#xff0c;我认为Python是一种非常有前途的编程语言&#xff…

ChatGPT可能被滥用于网络犯罪

科技是一把双刃剑 ChatGPT一经发布&#xff0c;短时间内就成为了现象级的应用。其清晰明确的回答和丰富的知识&#xff0c;昭示着AI技术造福人类&#xff0c;彻底简化我们生活工作这一美好的未来愿景。对于解决各行各业的许多问题&#xff0c;ChatGPT也提供了另外一种思路&…

用ChatGPT构建网络设备表,并根据设备关系生成网络拓扑

构造一个数据表&#xff0c;存储包括交换机、路由器、防火墙、入侵检测、上网行为管理等设备的编号、序列号、IP、MAC、访问地址、用户名、密码、管理员、物理位置、上联设备ip等信息 下面是一个示例数据表&#xff1a; Device IDSerial NumberIPMACAccess URLUsernamePassword…

七大语言模型“偏见与毒性”的角逐,ChatGpt3.5综合表现优良

颠覆性的技术进步和人工智能的快速发展&#xff0c;催生了现如今LLM&#xff08;大型语言模型&#xff09;和AIGC&#xff08;AI生成内容&#xff09;的盛行。这些创新性的模型和算法不仅能够理解、生成和处理人类语言&#xff0c;还能够模拟智能思维和创造力&#xff0c;成为各…

阿里版ChatGPT已接入钉钉,张勇:未来所有业务都有大模型加持

机器之心报道 机器之心编辑部 阿里&#xff1a;大模型也是基础设施。 4 月 7 日下午&#xff0c;阿里云没有一点预告的突然宣布&#xff0c;自研类 ChatGPT 产品开启企业邀测&#xff0c;模型名为「通义千问」。 虽然是非常小范围的测试&#xff0c;但邀测消息刚放出&#xff…

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者&#xff0c;从Chat2DB开源至今都有关注这个开…

估值 2 个月从 11 亿美元降到 3 亿美元,投资人清仓跑路,国产大模型创业遇冷...

图片来源&#xff1a;由无界 AI生成 创业未半&#xff0c;而中道崩殂。 6 月 29 日&#xff0c;美团发布公告以 20.65 亿元全资收购光年之外全部权益&#xff0c;距离光年之外正式营业刚过去 84 天。 这是目前中国大模型创业领域最大的收购案&#xff0c;光年之外也在 4 个月时…

英伟达帝国的一道裂缝

2012年&#xff0c;AI圈发生了两件大事&#xff0c;按时间顺序&#xff0c;第一件是谷歌组团已久的Google Brain发布“出道作”——一个能够识别猫的深度学习网络“谷歌猫”&#xff0c;74.8%的识别准确率&#xff0c;比知名识别图像大赛ImageNet前一年获胜算法的74%还要高出0.…

也谈“前端已死”

一、一些迹象 逛社区&#xff0c;偶然看到了这张图片&#xff1a; 嗯……我眉头一皱&#xff0c;久久不语&#xff0c;心想&#xff0c;有这么夸张吗&#xff0c;假的吧&#xff1f; 突然想到&#xff0c;最近我在社区发了个前端招聘的信息&#xff0c;结果简历漫天纷飞&…

写文、画图、替人直播,小巨头混战AIGC

文&#xff5c;光锥智能&#xff0c;作者&#xff5c;黄小艺、郝鑫&#xff0c;编辑&#xff5c;刘雨琦 大模型的春风&#xff0c;吹乱了内容平台们的心。 作为“被革命”的第一梯队&#xff0c;内容平台们跃跃欲试&#xff0c;欲抢占时间窗口。 5月6日&#xff0c;小红书被曝…