jsp:能够在页面中把数据动态化,jsp和html在元素标签上是无区别的,区别是html中写上java代码就成了jsp文件。filename.jsp
。
需要把html文件转换成jsp文件,以达到动态显示数据的目的。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int i = 0;
%>
让类可以接收请求:extends HttpServlet
;doGet
, doPost
,service
都是可以接收前端请求的方法,可以重写它们!
区别:前端发送的GET请求,则调用doGet方法;前端发送POST请求,则调用doPost方法。而service可以接收所有请求。
java查看源码?
问题:怎么找到java类的源代码?
<form class="form-horizontal" action="register" method="post">form>
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("----dopost()----");
}
问题:试了好多次,后端好像一直收不到请求。后面又突然可以了,真是奇怪。
感受:到了Servlet,又给人一种强烈的黑盒感,你根本不知道它在干什么。也许我从来就没有很理解过Web。
问题:为什么要在doGet中调用doPost?前端用Get方法能正常将参数传递过来吗?
如何取得请求中的参数:
在前端,input的文本输入框(type="text"
)需要设置name
属性,相当于变量名。传输到后端之后,可以据此取出数据。
input单选框(type="ratio"
)需要设置value
属性。
在后端,使用request对象。
String nickName = request.getParameter("nickName"); // 参数均为String
int _sex = Integer.parseInt(sex); // String --> int
GET与POST:
问题:为什么post打包就相对安全呢?别人解包不就行了?
响应前端:
/register
,然后再重定向到另一个页面。// 请求转发,并附带两个参数
request.getRequestDispatcher("index.html").forward(request,response);
// 重定向(注册失败 --> 跳转到注册页面重新注册)
response.sendRedirect("register.jsp");
问题:在html的form表单中,如果使用post请求,则中文字符串无法正常得到;但改用get请求时是正常的。
----dopost()---- // 使用post请求
Users [id=0, nickname=??????, password=123456, sex=1]
----dopost()---- // 使用get请求
Users [id=0, nickname=hello, password=123456, sex=2]
问题(踩大坑一个):在普通java代码中,可以注册成功;但是改成web项目运行,就会报错:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
。web项目的代码是在Tomcat服务器中运行的,所以还需要将jdbc的jar包添加到磁盘tomcat服务器的lib目录下。
参考:servlet中调用JDBC报错:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver_啥也不会的小学生的博客
显示错误消息:
:分块标签。${info}
: 取request中的信息(一种快捷的方法)。request.setAttribute("info", "网络原因,注册失败,请重新注册!");
记录:在前端提交空表单时,程序会寄。
思路(一定要细化):点击登录,进入登录页面,输入用户名和密码,点击登录按钮,把数据提交到servlet中,servlet中获取输入的用户名和密码,只需指定能否登录。控制器调用service要结果,service调用dao要数据。
步骤:
-- 只能提示“用户名或密码错误”,能查到数据就说明用户名密码正确。
select uid from users where nickName = 'zhangsan' and password = '123456';
问题:若登录窗口是弹出的新标签页,那登录后如何回到原来的页面,并显示成功登录的状态?
登录后显示用户名:
request对象:作用域只是在当前请求中有效。
会话:当打开一个浏览器,就创建了一次会话。当浏览器关闭时,当前会话就结束了。
会话对象:session ,作用域是整个会话。
request.getSession().setAttrivute("nickname", nickname);
${nickname}
问题:会话没有效果,在我的尝试中,它的作用域就和
request.setAttribute()
相同。使用重定向,或者打开新页面时,都无法显示用户名。只有使用请求得到的那个页面中才能显示用户名。发现:存在浏览器的影响,当我从Edge更换为小白浏览器后,一切正常(尝试了各种qq、谷歌、华为等各种浏览器后,发现只有Edge存在这个问题)。
乱码问题:
tomcat/conf/server.xml
,修改URIEncoding="UTF-8"
request.setCharacterEncoding("UTF-8");
标签进行判断。<%@ taglib uri="http://java.sun.com/jsp.jstl/core" prefix="c" %>
...
问题(open):引入标签库报错:
Can not find the tag library descriptor for "http://java.sun.com/jsp.jstl/core"
。使用中说“ 将tomcat引入进去,才会有这个标签库 ”,如何引入?
公共页面的抽取:
header.jsp
,将导航栏放入其中。然后在其它需要的页面引入。
感受:jsp的调用页面,与flask中的模板块方式还是有所不同。模板块是有一个
base.html
作为一个整体的统一结构,其它页面继承它并覆盖其中的一些块。
注销:
注销
1、启动服务器之后,项目访问不了
WEB-INF/
(类路径)下是编译好的字节码。localhost:8080/friends/index.jsp
。如果修改项目名称,而这里没变的话,使用新名称是访问不了的。2、其它一些问题
%
啥的。一进首页,就要能拿到数据,直接访问index.jsp
是拿不到的。
思路:发送请求到 control,在 control 中获得推荐朋友的集合数据,再响应 index.jsp,然后 index.jsp 遍历数据。
(图片上传比较复杂,可以先直接在本地放两张用一下)
indexServlet.java
,路径为/index
。getUsersByIndex(Users user)
方法,根据用户的性别和状态进行查询。-- 查询推荐朋友
select uid,nickname,photo,words from users where indexstatus=2 and sex=1 limit 8;
前端遍历数据: 使用 jsp 的标准标签库
宣言:${user.words}
注:${user.words} 相当于调用了 Users 类的 get 方法
老师说:许多人缺少独立思考的能力,不告诉一步步怎么做,就不会做。
<%@ taglib uri="http://java.sun.com/jsp.jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
问题:我在 blog_java 项目中是由 jstl 包的,但是在 myfriends 项目中不知道为啥没有。不过,把包贴过去之后就好了。
-- 全部设置为不推荐(2)
update users set indexstatus=1;
老师杂谈:了解北京,可以去上地,95%是IT;八王坟地铁站,非常挤;天通苑,一个小区400万人。这样的芸芸人海,害。
没有推荐数据时,提示系统暂无推荐:EL表达式如何判断集合是否为空
<c:if test="${empty list_friend}">
集合为空
</c:if>
后台登录:
思路:首页中点击导航栏中的“后台管理”,进入后台管理登录,登录后进入后台管理,进行用户信息管理。可以复用普通用户登录模块,减少冗余代码。
可以在数据库中指定 admin 账号,然后根据 uid、用户名来判断。作用是不用单独写管理员登录的control、service、dao代码。
显示用户列表:与首页数据显示的思路类似。
注:response.sendRedirect 中的
index.jsp
都应该换成index
。
services/IUsersServices
普通用户 - 个人中心:
${user.sex==1?"女":"男"}
。感受:老师水平确实可以,页面简洁大气。
问题1:图片的上传比较麻烦,感觉可以先存一些图片,然后提供给用户选择,而不是让他自己上传?
问题2:修改信息时,用户信息的回显如何实现?
注释:
try-fianlly
中,不管 try 里面怎么写,最后 finally 都会执行,即使在 try 里面写了 return。思路:设计前端页面时,先使用硬编码填充数据。写后端时再进行替换,实现静态数据的动态化。
未完但完