技术标签: java 后端 java基础学习笔记 开发语言
B/S:浏览器/服务器。 浏览器通过网址来访问服务器
servlet 是运行在 Web 服务器中的小型 Java 程序(简单理解为:服务器端的小应用程序)。
作用:接收用户的请求,并对请求做出处理,处理结果响应给客户端
Servlet是JavaWeb的三大组件之一(servlet、过滤器、监听器),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据、处理请求、完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
示例Servlet接口:
ervlet.java
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
相关方法:
void init(ServletConfig); 出生(servlet被创建成功后执行的方法)
void service(ServletRequest,ServletResponse); 服务
void destroy();销毁
服务器会在Servlet第一次被访问时创建Servlet,或者是在服务器启动时创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。
当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!
Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。
示例:
public class HelloServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("Servlet被创建了!");
}
public ServletConfig getServletConfig() {return null;}
public void destroy() {
System.out.println("Servlet要离去了!");
}
public String getServletInfo() {return null;}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("hello servlet!");
}
}
因为servlet是单例的(100个人访问,访问都是同一个servlet)
因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:“不是线程安全的”。这说明Servlet的工作效率很高,但也存在线程安全问题!
所以我们不应该在Servlet中随便创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。
2 让服务器在启动时就创建Servlet
默认情况下,服务器会在某个Servlet第一次收到请求时创建它。也可以在web.xml中对Servlet进行配置,使服务器启动时就创建Servlet。
<servlet>
<servlet-name>hello1</servlet-name>
<servlet-class>cn.test.servlet.Hello1Servlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello1</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hello2</servlet-name>
<servlet-class>cn.test.servlet.Hello2Servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hello3</servlet-name>
<servlet-class>cn.test.servlet.Hello3Servlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello3</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
1、创建一个MyServlet继承HttpServlet,重写doGet和doPost方法,也就是看请求的方式是get还是post,然后用不同的处理方式来处理请求
2、在web.xml中配置MyServlet,为什么需要配置?让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用。
配置四个东西。
配置之后,浏览器是如何通过我们配置的信息来找到对应的servlet的。
按照步骤,首先浏览器通过http://localhost:8080/test01/MyServlet来找到web.xml中的url-pattern,这就是第一步,匹配到了url-pattern后,就会找到第二步servlet的名字MyServlet,知道了名字,就可以通过servlet-name找到第三步,到了第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。
3、实验,验证上面配置成功。
4、利用向导新建MyServlet,右击项目,在new选项中有直接新建servlet的选项,配置MyServlet类中的信息
5、配置web.xml中的servlet信息
6、查看MyServle01类中的代码和web.xml,其中的配置跟手动的配置是一样的,只是用图形化界面,让我们更方便的创建servlet而产生的。
(1)get提交中请求参数以 ?username=admin&password=admin123 形式拼接在路径(url)的后面
(2)不安全的提交方式
(3)提交的参数个数是有限制的,get方式能提交的数据只能是文本,且大小不超过1024个字节
(4)提交后调用的是doGet()方法处理
(1)提交的请求参数是放在请求体中(http包的包体中)
(2)相对安全的提交方式
(3)参数个数没有限制的,post不仅可以提交文本还有二进制文件。
(4)提交后调用的是doPost()方法处理除了用form表单提交指定为post方式则为post方式提交,其它均为get方式提交
重定向(Redirect):
是指当浏览器请求一个URL时,服务器返回一个重定向指令,告诉浏览器地址已经变了,麻烦使用新的URL再重新发送新请求。
示例:
//已经编写了一个能处理/hello的HelloServlet,如果收到的路径为/hi,希望能重定向到/hello,可以再编
//写一个RedirectServlet
@WebServlet(urlPatterns = "/hi")
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 构造重定向的路径:
String name = req.getParameter("name");
String redirectToUrl = "/hello" + (name == null ? "" : "?name=" + name);
// 发送重定向响应:
resp.sendRedirect(redirectToUrl);
}
}
转发(Forward):
Forward是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。
示例:
//已经编写了一个能处理/hello的HelloServlet,继续编写一个能处理/morning的ForwardServlet:
@WebServlet(urlPatterns = "/morning")
public class ForwardServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/hello").forward(req, resp);
}
}
文章浏览阅读649次。第四届省赛主要涉及到IIC和DS1302,在官方驱动基础上进行改动。#include <STC15F2K60S2.h>#include "ds1302.h"#include "iic.h"#define uchar unsigned char#define uint unsigned intuchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X9..._第四届蓝桥杯单片机省赛 site:blog.csdn.net
文章浏览阅读1w次,点赞5次,收藏45次。1、通过输入鼠标右键获取光标在屏幕上的坐标信息,if(Input.GetMouseButtonDown(1)){ Vector3 mousePosition= Input.MousePosition;}//此处获得的是光标在屏幕上的相对坐标,不方便直接使用。2、将该光标转化为世界坐标//从相机中打出一个经过mousePosition的射线Ray ray=Camera.main.ScreenP..._unity获取鼠标点击的位置,并将其赋值给物体1的坐标
文章浏览阅读4k次,点赞2次,收藏13次。当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。文章演示Android打包,ios打包也差不多步骤(ios要自有证书,测试证书只能用在越狱手机上上)。项目基于vue-cli方式创建,打包成Android ios手机apk。第一步: 勾选需要打包为 Android 还是 ios 的手机apk。第三步:测试app包,选择公共测试证书就好了,正式上线选择自有证书。应用名称:打包后的Apk包名称。_vueuniapp打包成
文章浏览阅读4.2k次。Windows下的ttf字体是可以在Linux上使用的,我们可以“盗用”Windows现成的字库,所以我们只需要把windows下的字体文件上传到Linux上,执行相关命令就行了。(1)创建目录mkdir -p /usr/share/fonts/my_fonts(2)将要安装的字体上传到该文件夹下这里我们安装黑体常规,即simhei.ttf。关于具体字体查找,我以windows为例。进入C:\Windows\Fonts,该文件夹下就存放相关字体,将simhei.tty拷贝到linux 目录/u_可以讲windows上的字体放在linux服务器上吗
文章浏览阅读4.9w次,点赞6次,收藏29次。1、参考链接:https://blog.csdn.net/weijia_kmy/article/details/51304518昨天下载了ubuntu16.0.4,安装后发现没有wifi可连接,于是上网查了一个晚上,都没有可行的办法。无奈今早就又下载ubuntu15.10安装,发现可以连wifi。用了一会突然桌面没了。我的天!又捣鼓了一上午......也没好过来。个人感觉15.10没16.04好。..._ubuntu 16.04 连接 usb网卡
文章浏览阅读198次。一位在觉醒向量做数据标注的员工说:正如别人评论的那样,我们的工作的确很像数字世界的建筑工人,但是我们在扮演着很重要的角色,因为没有我们,AI这栋摩天大楼就无法建成。 大数据作为一个术语而言,其历史可能并不久远,但形成数据的许多基础早已经奠定。我们来简要回顾一下引领我们进入数据时代的历史。大约公元前18000年人类用计数棒进行储存和分..._数据标注未涉及的行业
文章浏览阅读738次。一前言PO(/PI)是SAP公司的一个中间件产品,用来辅助连接SAP系统与外围系统. (当然外围系统之间也可以使用PO).作为中间件,PO支持很多与系统交互的方式(RESTful, SOAP ,JDBC, FILE )等等百度了一下 webService 与SOAP的关系(如图一)可以看出SOAP只是webService三要素之一, 用来描述传递信息的格式本文主要介绍webService在PO中的应用及特殊映射方式图一二ABAP与webServiceABAP可.._sap po edit external definition
文章浏览阅读7.1k次,点赞4次,收藏20次。通达信公式编写入门通达信公式入门公式编辑器快捷键: [Ctrl+F][.9]我们大多数的用户并不是完全了解“公式编辑器”的意义, 简单地,我们可以从以下几个角度进行理解:一、指标分析:“公 式编辑器”好比是一个工作母床,通过这个工作母床可以制造出所需要的各式各样的零件, 同样,在指标分析的工作中, 利用编辑器可以编写出相应的分析条件..._通达信编程3000例pdf
文章浏览阅读3.4k次,点赞2次,收藏14次。Cado-nfs使用CADO-NFS是C / C ++中数字字段筛选(NFS)算法的完整实现,用于分解整数并计算有限字段中的离散对数。它包含与算法所有阶段相对应的各种程序,以及可能在计算机网络上并行运行它们的通用脚本。Cado-nfs gitlab地址1. Cado分解大整数命令非常简单,直接加上大整数即可./cado-nfs.py [大整数]举个栗子./cado-nfs.py 9037762929200312168400214710176085810924733654900109067_cado-nfs
文章浏览阅读4.2k次,点赞6次,收藏48次。文章目录基于Django+Vue网上购物商城一、项目介绍1.技术难点2.系统功能3.项目环境4.后台管理页面二、项目准备创建Django工程报错 及解决三、数据库模型设计1.创建app包以及app里面的四个应用2.用户认证数据库模型设计(1)设计代码(2)settings中配置,替换系统的用户(3)settings中注册,到INSTALLED_APPS(4)迁移数据库2.商品管理模型设计(1)安装..._django 不要 admin
文章浏览阅读10w+次,点赞140次,收藏375次。今天用IDEA,需要导入一个Jar包,因为以前都是用eclipse的,所以对这个idea还不怎么上手,连打个Jar包都是谷歌了一下。但是发现网上谷歌到的做法一般都是去File –> Project Structure中去设置,有没有如同eclipse一样简便的右键添加方法呢。然后自己摸索了一下,找到了。以阿里大于的依赖包为例子,因为正好是我遇到要导入的Jar包。先说下第一种方法吧。也就是Fi..._idea将前端jar包导入到后端
文章浏览阅读1.1k次。循环与判断一、判断判断语句通常基于某种条件触发,当条件满足时,执行一些特定的操作。1.if语句Python使用关键字if语句实现判断,最简单的用法为:if :其中包含这样几个部分:if关键字,表示这是一条判断语句;表示判断的条件,当这个条件被满足(即条件为真)时,执行中的代码,条件不满足,中的代码不会被执行;冒号表示判断代码块的开始;表示条件满足时,执行的代码块。举个例子:x = 1if x &g..._mysql判断成绩等级循环