更新ing
一.Servlet开发
创建包:在java程序最前面加上 package 文件名.文件名.文件名.(想几级目录就几级目录)
首行定义本java文件属于哪个包其实,简单理解,包就是该java文件的存放目录嘛,这个目录不一般,因为他有域的作用,可以让同名文件存在(因为目录不同啊)
WebStudy是我项目名WEB-INF 创建项目后自动生成的文件夹
classes 存放大部分文件
下面就是你package的路径
包创建好了,就在这个包里面创建一个Servlet,别问我为什么要现有包,我目前觉得是因为好区别Servlet,就相当于给全国的名字叫Servlet的人,改姓。姓是包路径,名是类名(我这个叫ResponseDemo01),请记牢这个观点(原创哦~)
Servlet直接next创建,关键来了,是web.xml的配置
初始的web.xml文件各标签含义自行查询
在web.xml中配置servlet这个就是关键了,搞了一下午才整明白。
<servlet></servlet>标签注册一个servlet,包含2个子元素<servlet-name><servlet-class>。name随你叫,class就关键了!它就是我说的“姓+名”——“raul.response.study.ResponseDemo01”(我这里叫这个,你看你自己的包+类名)。现在能记清了吧!网上看到的那些HellowWorld简直无力吐槽,真是蠢哭了,事实上能用helloworld让你真正了解原理的教程还是少的,要走心(像我这样啊!)
然后第二个标签<servlet-mapping>映射一个已经注册的servlet的对外访问路径,name和url-pattern。
name就是你注册的名字,这里我只注册了一个是test1,我这里也是给他配置映射,so,name=test1.
url-pattern有意思了,怎么来的?随便叫啊!“/”的意思是缺省了根目录。我这里就是WebStudy,也就是项目名字。后面怎么取完全看你兴趣,/asdasd;/handsomeme;/haha.haha都行,url就是个地址名字罢了,这里是为了让你输入浏览器中的url对应于你的servlet,所以你这里怎么取,那么你在浏览器就应在怎么输入(所以还是按套路来吧,别任性)
看到url没有,任性嘛?再次提醒一下,web.xml中的url,/就代表着缺省的项目根目录名(WebStudy)!
那么mapping也就是找个url和你注册的servlet对应起来,相当于你这个人(姓+名)住在哪里!哪里就是这个url了!
小提示,更改了servlet源文件或者web.xml都需要重启服务器才能正确响应
补充:
servlet文件这里的@WebServlet就是上述的url-pattern
二.html寻址
DrawImage所在目录 html地址 DrawImage的url则,在html中想跳转到此servlet,如图所示:
html跳转地址代码说明:html在哪里执行,那么默认的地址就是当前目录,我这个html是在localhost:8080/WebStudy/DrawImage/这个目录下的,所以在这个html中的所有默认路径就是这个路径!
那么我现在想跳转到我的servlet(localhost:8080/WebStudy/DrawImage,这里的DrawImage是servlet文件),只需要先“../”返回上一级目录到WebStudy,再“/DrawImage”即可!
暂且别用变量绝对寻址把,有点昏?(代更新此处)
(更新来了)
绝对地址:
/项目名称/项目内各级子文件夹/xxx.xxx
绝对地址指的是本网站的绝对地址,以斜杠/起头,在javaEE中第一级路径也被称为上下文(context),其后的各级路径是应用程序内的路径,最后是文件名,以及查询字符串等。
Login目录下的login.jsp以上图login.jsp为例,他的绝对路径是 /Bridge/Login/login.jsp
我们在jsp里面一般写作
<a href="<%=request.getContextPath()%>/Login/login.jsp
相对地址:
是本网站中与当前页面相对的地址,比如我在Login目录下还有一个Logout目录,则下述地址表示当前页面所在目录的Logout子目录中的logout.jsp文件
Logout/logout.jsp
差别在于 开头有没有斜杠
三.request接收表单提交的中文乱码问题
核心理念:让服务器与客户端的编码解码方式统一
post方法提交表单的乱码:是因为服务器与客户端(浏览器)的编码不一致造成的,通常情况下是客户端UTF-8,服务器是其他的编码。解决方法:
request.setCharacterEncoding("UTF-8")使用request.setCharacterEncoding("UTF-8");设置服务器以UTF-8的编码接收数据后,就不会产生中文乱码问题了。
GET方法提交表单的乱码:get方法服务器端默认用ISO8895-1编码方式接收数据,改不了的。解决方法:
转为字节码再重编在接收到数据后,先获取request对象以ISO8895-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
超链接乱码:超链接上的中文想必就是get显式上传的数据,如:
raul/test?userName=周慕宇&password=123321
这就是get乱码问题,一样解决。
不过大佬说最后在使用了中文参数的URL进行URL编码处理如:
raul/test?userName=<%=URLEncoder.encode("周慕宇","UTF-8")%>&password=123321
你可以试一下,应该这样的就等于把servlet的工作提到了jsp解决,原理一样。
PS:eclipse字符编码的6默认配置是GBK和ISO-8895-1。前者全局设置,后者jsp网页设置(每次新建jsp改编码是不是很烦?)。我们这里把它都改成中文支持的UTF8,如下:
Window --> Preferences
General,Workspace Web,JSP Files四.mysql8.0 的jdbc使用
共有两种方法注册驱动:
(1) DriverManager.registerDriver(new Driver())
(2)Class.forName("...")
法1注册驱动时,会导致驱动程序注册两次,即内存里会有两个Driver对象;且该方法依赖mysql的api,脱离mysql的jar包程序将无法编译。故在实际开发中推荐采用法2.
1.导入下载的mysql8.0版本的jdbc
mysql0.8 JDBC2.使用Class.forName("url")注册驱动
URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接那个数据库,URL的写法为:
URL格式常用数据库的URL地址写法大家可以百度,这里要说的是mysql8.0的专用写法,经本人多次尝试,标准的mysqlURL写法无法注册8.09版本的驱动,通常mysql的URL写法:
jdbc:mysql://localhost3306/databaseName
而8.0写法:
com.mysql.cj.jdbc.Driver要问为啥的话,查看它的文档应该能看到(不过大概率估计,就是要你这么写,格式而已)。
3.Connection创建
getCoonection的修改这里切记要在这个url里添加上useSSL和serverTimezone这两个属性的值,不然无法创建连接!
创建mysql8.0的驱动与旧版本mysql驱动的区别就是以上2,3两点,之后的操作相同。
4.完整操作
mysql8.0驱动完整操作五.Filter应用(待完善)
filter作为web开发的一门核心技术(功能),被广泛应用于各个网站。正如其名,它起到了过滤资源的作用,也就是让网站实现了用户资源相互独立与不共享的功能。更简单的说,filter实现了在调用资源前,可以运行一段java代码,调用资源后,还可以运行一段java代码的功能。
Filter的开发分为两步:
1.编写filter继承类
2.xml文件中注册该filter
这里用一个很简单的例子来给大家展示一下,功能是使用Decorator(装饰器)包装request对象解决get和post请求下的中文乱码问题,这个问题在第三点我们提到过,中文乱码的原因就是客户端与服务器的编码格式不一样造成的,在这里我们通过过滤器来完成统一编码的操作。
ps:Servlet API中提供了一个request对象的decorator设计模式的默认实现类HttpServletRequestWrapper,这个类实现了request接口的所有方法,但这些方法的内部实现仅仅都是调用了一下所包装的request对象的对应方法而已,以避免用户在对request对象进行增强时需要实现request接口中的所有方法。Decorator就是给你扩展类功能而又不影响正常类功能实现的设计方式。
1.Filter继承类CharacterEncodingFilter主要代码如下:
引入包 doFilter方法(过滤主体) 类初始化 继承HttpServletRequestWrapper的自定义request装饰器类(MyCharacterEncodingRequest类与CharacterEncodingFilter类写在同一个java文件下即可)
2.xml中注册filter:
CharacterEncodingFilter注册注册xml之前也说过,基本上就是注册名字,然后注册其映射地址。在这里再说一下各标签的含义:
(第一步注册中)
<description>添加描述信息,可不配置
<filter-name>指定过滤器名称,不能为空,必要
<filter-class>指定过滤器完整限定类名称
<init-param>为过滤器指定初始化参数,如果过滤器不需要指定初始化参数,可以不配置
注册(第二部映射中)
<filter-mapping>设置过滤器所负责拦截的资源,它可以通过两种方式来指定:Servlet名称和资源访问的请求路径
<filter-name>注册了的过滤器名称
<url-pattern>设置过滤器所拦截的请求路径。/*表示都拦截
<servlet-name>指定过滤器所拦截的Servlet名称
<dispatcher>指定过滤器所拦截的资源被Servlet容器调用的方式(REQUEST、INCLUED、FORWARD、ERROR之一,默认REQUEST)
映射3.显示界面jsp程序:
Charactor.jsp标签的下载与安装看这里:JSTL的使用
4.jsp中使用的Servlet程序(ServletDemo1):
ServletDemo1需要注意,在使用PrintWriter对象前,需要先设置response.setContentType("text/html;charset=utf-8")。否则在这里输出出来的服务器文字会是乱码:
服务器文字乱码
网友评论