美文网首页常回来看看程序员
JavaWeb开发注意点总结(更新中)

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

作者: 末一哟 | 来源:发表于2018-12-07 16:47 被阅读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")。否则在这里输出出来的服务器文字会是乱码:

    服务器文字乱码

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

    相关文章

      网友评论

        本文标题:JavaWeb开发注意点总结(更新中)

        本文链接:https://www.haomeiwen.com/subject/sqkltqtx.html