常回来看看程序员

JavaWeb开发注意点总结(更新中)

2018-12-07  本文已影响44人  末一哟

更新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 JDBC

2.使用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")。否则在这里输出出来的服务器文字会是乱码:

服务器文字乱码

我们没能力发现知识,我们只是知识的寄生虫

上一篇 下一篇

猜你喜欢

热点阅读