J2EE与中间件 学习笔记3 JSP MVC

本文主要参考自W3Cschool的JSP教程和PPT,以及来自我与一位很强的学长的聊天记录。

JSP

这部分我是很早就看别的同学用过但是自己一直没有用过,现在终于开始接触了。

简介

什么是Java Server Pages?

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

按照我的理解,JSP就是一个能让你写动态页面更方便的东西。

JSP结构

结构

Markdown

JSP处理

  • 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
  • Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
  • JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
  • JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
  • Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
  • Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
  • 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。

Markdown

我的理解就是,应该可以不用裸写Servlet了。目前我还没有写过JSP,等实验之后才知道对不对。

JSP生命周期

  • 编译阶段:

    servlet容器编译servlet源文件,生成servlet类

  • 初始化阶段:

    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

  • 执行阶段:

    调用与JSP对应的servlet实例的服务方法

  • 销毁阶段:

    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

Markdown

JSP的HelloWorld

<html>
<head>
<title>Hello World</title>
</head>
<body>
    Hello World!
    <br />
    <%
        out.println("Your IP address is " + request.getRemoteAddr());
    %>
</body>
</html>

看了这个示例之后我其实有一点没看明白的地方,就是为什么会有out和request两个变量没有声明就可以用了?这说明jsp肯定有一些内置的对象,于是我搜了一下,总共有9个内置对象。随便贴个链接给大家看一下。

简单语法

脚本程序

<% 代码片段 %>

声明

<%! declaration; [ declaration; ]+ ... %>

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %> 

表达式

<%= 表达式 %>

<html> 
<head>
<title>A Comment Test</title>
</head> 
<body>
<p>   
  Today's date: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body> 
</html> 

其实感觉会了语法就可以开始写了…但是事情没有这么简单,4-1的作业需要必须要用MVC,所以下面就开始MVC的学习。


MVC

Markdown

关于MVC与分层的区别以及引申开来的内容

其实没有搞明白MVC,于是找了一位现在在做架构师的学长问了一波问题……将我们的聊天记录整理了一下。下面用A来表示我,B表示学长。


A: X哥(学长要求匿名),我想问你一个关于MVC的问题。

Markdown

我记得以前软工课讲过的MVC,好像不是这个样子啊。

B: 奥,我的理解是MVC和分层的层面不一样,所以没有可比性。 软工二上比较MVC和分层的意义不大。一般提到 MV* 就是指展示层的技术。

A: 感觉MVC是不是比分层要微观一些。

B: 对,MVC我只知道两个地方可以用,一个是客户端或者前端,一个是Java系的web框架。前端自己有时候也把架构叫做mvc,又发展出mvp,mvvm啥的,和后台的mvc是并存的。


A: 后台为什么会有v层啊

B: 你之前是怎么做网页的

A: 我之前都是写后端的,不写网页。

B: 那你是把数据转成json传过去?

A: 嗯是的。

B: 比如jsp吧,他是运行时后台输出好一份html代码然后返还回去。所以jsp定义的是html的生成规则,输出的是页面显示的内容,所以叫view。model没有方法。javaWeb版的MVC的 model == VO。

A: 哦那也就是说,C 只能是业务逻辑了?

B: 也不是,c没有业务逻辑,他是转发给下一层,但是下一层不是model,已经和mvc没关系了。


B: 为了简化先假设前端非常简单,只是一些静态html,没有js。

Markdown

对于第3步,比如你的页面要显示你的用户名和头像

UserVo userVo = new UserVo( username, avatarUrl ); //UserVo就是model

一般都是创建个新对象。

对于第4步,这里实际上是controller调view,view就像是一个能生成html的子方法一样。

A: 比如view 有个方法可以传一个参数UserVo?

B: 对。

B: 第六步嘛,一般有各种方式,可能框架帮你做了,可能要你手动做。像springMVC自动化程度比较高,写出来确实是

UserVo function() {
   return new UserVo();
}

但不是返回给了view,而是框架帮你做了

String html = view(userVo);
return html;

B: 奥还有一点,后台web框架的MVC和 前端/客户端的MVC不是一回事,比如你的前端队友说我们不用mvc了,用mvvm吧,你要知道这和你关系不大。


A: 那我们之前那种传json的方法是不是就不属于MVC啊

B: 是

A: 那那个属于什么啊

B: 可以叫API后台吧


接下来是PPT中的内容

Web Application Control Flow

  1. Client makes a request (Web browser).

  2. Servlet gets the client’s request.

  3. Servlet determines which program elements (JavaBeans, EJBs or otherobjects) are required to carry out the specified request.

  4. JavaBeans or EJBs perform the business logic operations for theservlet, and encapsulate the results.

  5. Servlet selects a presentation template (JSP) for delivering thecontent back to the client.
  6. The JSP generates a specific response by accessing the resultantcontent available through the JavaBeans.

MVC中JSP的注意事项

MVC-JSP页面不应该创建对象

  • 应该由servlet,而非JSP页面,创建所有的数据对象。

  • 因此,为了保证JSP页面不会创建对象,我们应该使用

    <jsp:useBean ... type="package.Class" />

而不是

<jsp:useBean ... class="package.Class" />

JSP页面也不应该修改已有的对象

因此,应该只使用jsp:getProperty,不使用jsp:setProperty

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
J2EE开发中,我们经常需要对字符串进行编码,以便在不同的系统之间传输数据时,能够正确地处理特殊字符。其中,URLEncoder.encode(String, enc)是一种常用的编码方式。 URLEncoder.encode()方法的作用是将指定的字符串进行编码,以便在URL中传输。它的语法如下: ``` public static String encode(String s, String enc) throws UnsupportedEncodingException ``` 其中,参数s是要编码的字符串,参数enc是指定字符集的名称,如果不指定,默认为UTF-8。 该方法的返回值是一个编码后的字符串。 例如,如果要将字符串“Hello World!”编码为UTF-8格式的字符串,可以使用以下代码: ``` String encodedStr = URLEncoder.encode("Hello World!", "UTF-8"); System.out.println(encodedStr); ``` 执行该代码后,输出结果为: ``` Hello+World%21 ``` 可以看到,空格被编码为“+”号,感叹号被编码为“%21”。 需要注意的是,如果字符串中包含特殊字符,如“&”、“=”等,也需要进行编码,否则在URL传输时会出现错误。例如,如果要将字符串“name=张三&age=18”编码为UTF-8格式的字符串,可以使用以下代码: ``` String encodedStr = URLEncoder.encode("name=张三&age=18", "UTF-8"); System.out.println(encodedStr); ``` 执行该代码后,输出结果为: ``` name%3D%E5%BC%A0%E4%B8%89%26age%3D18 ``` 可以看到,等号被编码为“%3D”,中文字符被编码为UTF-8格式的字符串。 总之,URLEncoder.encode()方法是J2EE开发中常用的编码方式,可以有效地处理特殊字符,确保数据在不同系统之间的传输正确无误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值