jsp和servlet+新闻发布系统
2021-01-19 11:13
标签:clist lang 发布者 target http icon 运行时 代码冗余 lock C/S Client Server面向于客户端,用户通过客户端跟程序进行交互(需要维护客户端,成本较高) B/S Browser Server面向于浏览器,用户通过浏览器进行程序交互 http :// localhost:8080 / news/index.html URL组成: http:协议,除此之外还有(FTP,HTTPS,RMI,DUBBO) localhost:代表主机IP地址 8080:代表端口号 news/index.html:资源地址 WebLogic Ngnix Resin 目录介绍: /bin 存放各种平台下用于启动和停止Tomcat的脚本文件 /conf 存放Tomcat服务器的各种配置文件 /lib 存放Tomcat服务器所需的各种JAR文件 /logs 存放Tomcat的日志文件 /temp Tomcat运行时用于存放临时文件 /webapps 当发布Web应用时,默认情况下会将Web应用的文件存放于此目录中 /work Tomcat把由JSP生成的Servlet放于此目录下 启动方式: /bin目录下:startup.bat启动脚本 shutdown.bat停止脚本 如果遇到闪退的问题则在上述两个文件中添加如下代码: SET JAVA_HOME=D:\Java\jdk1.7 (java jdk目录) SET TOMCAT_HOME=E:\tomcat-7.0 (解压后的tomcat文件目录) 配置环境变量: 添加系统变量,名称为CATALINA_HOME,值为Tomcat的安装目录,在Path系统变量中添加一个%CATALINA_HOME%\bin Eclipse环境中新建一个Dynamic web project--->Target Runntime代表启动的web服务器----->Dynamic Web model version代表项目版本(3.0)--->点击Next直到 ---->Generate web.xml xxxxx将此勾选上才在WEB-INFO文件夹下有web.xml文件 web.xml文件是web工程的配置文件,其中welcome-file-list代表首次访问的页面集合,welcome-file代表首次访问的页面 目录结构: / Web应用的根目录,该目录下所有文件在客户端都可以访问(JSP、HTML等) /WEB-INF 存放应用使用的各种资源,该目录及其子目录对客户端都是不可以访问 /WEB-INF/classes 存放Web项目的所有的class文件 /WEB-INF/lib 存放Web应用使用的JAR文件 组成内容: page指令:属性1="属性值" 属性2="属性值1,属性值2"… 属性n="属性值n"%> 属性 描述 默认值 language 指定JSP页面使用的脚本语言 java import 通过该属性来引用脚本语言中使用到的类文件 无 contentType 用来指定JSP页面所采用的编码方式 text/html, ISO-8859-1 小脚本:代码
第一章.初始Web程序
1.什么是C/S架构和B/S
2.URL:统一资源定位符(Uniform Resource Locator)
3.Tomcat(Web服务器)
4.Tomcat:Web服务器,JSP/Servlet的容器
5.Web工程:
6.JSP:Java Server Pages 可以在HTML页面中嵌入Java脚本代码
表达式:表达式%>
声明:声明方法%>
注释:;注释,页面无法看见-->
第二章:JSP数据交互
jsp9大内置对象:
request 请求对象:可以获取用户提交请求的数据 可以对数据进行保存 转发
response 响应对象:可以向页面中响应数据 重定向
out 输出对象
application 全局上下文对象
session 会话对象
page 当前页面对象
pageContext
config 配置对象
exception 异常对象
一.假设用户在页面中输入了一些数据,那么我们程序员如何在后台进行数据的获取
request:请求
案例:注册页面
处理数据页面
//解決POST請求亂碼
request.setCharacterEncoding("UTF-8");
//用户在页面点击提交就是发送了一条请求,那么我们在获取数据时用的是request请求对象
String username=request.getParameter("username");
//解決GET請求亂碼
//username=new String(username.getBytes("ISO-8859-1"),"utf-8");
String password=request.getParameter("password");
String sex=request.getParameter("sex");
//获取用户提交的相同name属性值
String [] hobbys=request.getParameterValues("hobby");
String city=request.getParameter("city");
System.out.println("姓名:"+username+"\t密碼:"+password+"\t性別:"+sex+"\t愛好:"+hobbys[0]+"\t地址:"+city);
%>
二.处理乱码解决方案
POST处理乱码:request.setCharacterEncoding("UTF-8");
GET处理乱码方案一:
String username=request.getParameter("username");
//解決GET請求亂碼
//username=new String(username.getBytes("ISO-8859-1"),"utf-8");
GET处理乱码方案二:
在Tomcat的Server.xml文件中添加URLEncoding
三.示例:登陆
login.jsp:
check.jsp:
//解决乱码
request.setCharacterEncoding("UTF-8");
//步骤一:获取用户在页面输入的数据
String username=request.getParameter("username");
String password=request.getParameter("password");
//步骤二:校验用户名和密码
if((username!=""&&username!=null)&&(password!=""&&password!=null)){
if(username.equals("admin")&&password.equals("admin")){
//第一件事情:保存用户信息(可以用request对象也可以用session对象)
request.getSession().setAttribute("username", username);
//第二件事情:跳转页面(使用转发或者重定向)
//转发:同一次请求,在服务器内部进行,转发可以携带数据
request.getRequestDispatcher("welcome.jsp").forward(request, response);
//重定向:不同请求,在客户端执行,而且不能携带数据,需要制定全路径
//response.sendRedirect("/WebProject_Chap02/login/welcome.jsp");
}else{
System.out.println("登陆失败~");
response.sendRedirect("/WebProject_Chap02/login/login.jsp");
}
}else{
out.println("
out.println("alert(‘请输入用户名或者密码‘)");
out.println("location.href=‘http://localhost:8080/WebProject_Chap02/login/login.jsp‘");
out.println("");
}
%>
welcome.jsp:
欢迎登陆:${username }
四.session会话对象
会话是客户端与服务器建立的一次连接,会话有对应的过期时间,一旦会话过期或者关闭,那么存放再回话当中的数据将会自动释放
//设置session的失效时间
//session.setMaxInactiveInterval(5);
//获取会话ID,不同浏览器会话是不同的
out.print(session.getId());
//向session当中存放数据:一般用于存放用户的登陆信息
session.setAttribute("sessionKey", "张三");
//获取session中数据
Object value=session.getAttribute("sessionKey");
//删除session会话中的数据:当用户退出系统时,我们利用session的remove方法删除数据
session.removeAttribute("sessionKey");
session登陆拦截:在要拦截的页面中加入如下代码(思想为:登陆成功会往session存放用户数据,我们去页面中判断是否有用户数据就可以)
//步骤一:先获取session对象中保存的userName值
Object value=session.getAttribute("username");
//步骤二:判断value是否为空
if(value==null){
response.sendRedirect("/WebProject_Chap02/login/login.jsp");
}
%>
五.include指令:用于页面嵌套(将公共内容放到页面当中,然后通过指令引入页面)
sessionCheck.jsp:
pageEncoding="UTF-8"%>
//步骤一:先获取session对象中保存的userName值
Object value=session.getAttribute("username");
//步骤二:判断value是否为空
if(value==null){
response.sendRedirect("/WebProject_Chap02/login/login.jsp");
}
%>
其他页面引入,在page指令下方
六.application对象
//返回相對路徑的真實路徑
//out.print(application.getRealPath("application.jsp"));
//获取当前的网站访问次数
Integer count = (Integer)application.getAttribute("count");
//当前访问为第一次时
if(count==null){
count=1;
}else{
count++;
}
//更改完访问次数后添加到application对象当中
application.setAttribute("count", count);
%>
当前您是第"+application.getAttribute("count")+"访问的网站~" %>
七.作用域
jsp4大作用域,从小到大为:
1.page:当前页面有效
2.request:同一次请求有效
3.session:同一个会话有效
4.application:同一个应用有效
八.cookie
1.cookie和session区别
1.1 cookie不是内置对象,session是
1.2 session是在服务器内部存放信息的,而cookie由服务器创建,但是数据保存到客户端
1.3 session保存的数据为Object类型,而cookie保存的是字符串
1.4 session由会话结束而失效,但是cookie是长期保存到客户端的
1.5 session对比cookie安全一些
2.cookie案例:保存用户名信息
login.jsp代码:
String username="";
//获取cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(int i=0;i //先看当前cookie当中有没有存放的name值 if(cookies[i].getName().equals("username")){ //获取value username=cookies[i].getValue(); } } } %>
用户名:
密码:
check.jsp页面代码:
//解决乱码
request.setCharacterEncoding("UTF-8");
//步骤一:获取用户在页面输入的数据
String username=request.getParameter("username");
String password=request.getParameter("password");
//步骤二:校验用户名和密码
if((username!=""&&username!=null)&&(password!=""&&password!=null)){
if(username.equals("admin")&&password.equals("admin")){
//第一件事情:保存用户信息(可以用request对象也可以用session对象)
request.getSession().setAttribute("username", username);
//用Cookie存放数据
Cookie cookie=new Cookie("username",username);
//利用response对象将cookie保存到客户端
response.addCookie(cookie);
//第二件事情:跳转页面(使用转发或者重定向)
//转发:同一次请求,在服务器内部进行,转发可以携带数据
request.getRequestDispatcher("welcome.jsp").forward(request, response);
//重定向:不同请求,在客户端执行,而且不能携带数据,需要制定全路径
//response.sendRedirect("/WebProject_Chap02/login/welcome.jsp");
}else{
System.out.println("登陆失败~");
response.sendRedirect("/WebProject_Chap02/cookie/login.jsp");
}
}else{
out.println("
out.println("alert(‘请输入用户名或者密码‘)");
out.println("location.href=‘http://localhost:8080/WebProject_Chap02/cookie/login.jsp‘");
out.println("");
}
%>
第四章:Servlet
一.什么是Servlet?
Servlet是一个自定义的类,暴露给客户端一个访问地址,可以实现跟用户交互
二.Servlet的3种创建方式
方法一:新建一个类,实现Servlet接口
@WebServlet(urlPatterns= {"/FirstServlet"},loadOnStartup=1)
public class FirstServlet implements Servlet{
/**
* 初始化Servlet
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("========================Servlet初始化工作完成~");
}
/**
* 获取Servlet配置
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 处理用户请求的方法
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//接受用户携带的参数数据
String parameter = req.getParameter("address");
System.out.println("==========================处理用户请求~\t"+parameter);
}
/**
* 获取Servlet信息
*/
@Override
public String getServletInfo() {
return null;
}
/**
* Servlet销毁方法
*/
@Override
public void destroy() {
System.out.println("==========================Servlet销毁~");
}
}
方法二:新建一个类,继承GenericServlet
@WebServlet("/SecondServlet")
public class SecondServlet extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("GenericServlet方法二的请求方法service");
}
}
方法三:新建一个类,继承HttpServlet(手动重写doGet和doPost)
@WebServlet("/ThreadServlet")
public class ThreadServlet extends HttpServlet{
/**
* doGet专门处理HTTP Get请求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Get和Post请求都能执行");
}
}
三.Servlet配置访问地址
方式一:基于web.xml
方式二:基于注解
在类上加入@WebServlet("/FouthServlet")注解,括号内一个参数时直接传入地址,不要忘记加/
四.Servlet初始化时机
默认初始化时机为客户端请求时执行init方法,可以根据loadOnStartUp属性(默认为-1)控制
更改初始化时机:
注解方式:
@WebServlet(urlPatterns= {"/FirstServlet"},loadOnStartup=1)
五.Servlet生命周期
1.由Servlet容器进行创建实例
2.初始化
3.执行处理请求方法
4.销毁
客户端发送请求时,Servlet容器会创建对应Servlet实例,然后执行init初始化方法,然后执行service处理请求方法,最终Servlet容器释放会调度Servlet的destroy方法
六.JSP和Servlet交互(模拟登陆退出)
login.jsp页面
UserSerlvet代码:
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
// 序列化标识ID
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 区分不同功能
String action = request.getParameter("action");
if (action != null) {
if (action.equals("login")) {
// 获取到用户提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 判断用户名和密码是否正确
if (username.equals("admin") && password.equals("admin")) {
// 保存用户信息
request.getSession().setAttribute("user", username);
// 跳转到Welcome.jsp页面
response.sendRedirect("/WebProject_Chap03/welcome.jsp");
} else {
// 解决服务器向客户端发送信息乱码
response.setContentType("text/html;charset=utf-8");
// 提示:用响应对象构建提示页面
response.getWriter().write("
response.getWriter().write("alert(‘请输入用户名或者密码‘);");
response.getWriter().write("location.href=‘/WebProject_Chap03/login.jsp‘");
response.getWriter().write("");
}
} else if (action.equals("logOut")) {
// 清除session数据
request.getSession().removeAttribute("user");
response.sendRedirect("/WebProject_Chap03/login.jsp");
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
welcome.jsp页面代码
欢迎登陆:${user } 退出
七.初始化参数
局部Servlet:利用ServletConfig接口
web.xml文件配置
Servlet内获取:
String initValue = getInitParameter("init");
System.out.println("ServletConfig:"+initValue);
全局:所有Servlet共享:
web.xml文件配置
获取:
//获取全局初始化参数
String context = getServletContext().getInitParameter("context2");
System.out.println("ServletContext:"+context);
第五章:Dao模式
一.数据持久化:数据从瞬时状态到持久状态的改变
二.DAO模式
软开当中:分层概念
1.实体层:Entity(一个类对应的一个数据库表) Grade:GradeId GradeName
2.数据访问层:Dao层(数据访问:将数据库的数据取出来保存到Entity当中,同样将Entity中的数据保存数据库)
3.业务逻辑层:Service层(书写业务逻辑的)
4.UI层:Servlet 跟用户进行交互的
传统开发:代码冗余,代码耦合
//步骤一:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//步骤二:获取连接
Connection con=DriverManager.getConnection("jdbc:mysql:///myschool","root","root");
//步骤三:准备一条SQL
String sql="select * from student where studentName=? and StudentNo=?";
//步骤四:获取PreparedStatment对象
PreparedStatment ps=con.preparedStatement(sql);
ps.setObject.setObject
//步骤五:执行SQL
ResultSet rs=ps.executeQuery();
//步骤六:处理数据
if(rs!=null){
while(rs.next()){
String name=rs.getxxx(COLUNM);
String sex=rs.getxxx();
}
}
//最后回收资源
insert into Student(xxxxxxxx) values(?,?,?,?,?)
三.Dao模式环境搭建
BaseDao工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
// 步骤一:创建数据库4大连接参数
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/myschool?useUniCode=true&characterEncoding=utf-8";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
// 封装一个获取连接的方法
public void getConnection() throws Exception {
// 加载驱动
Class.forName(DRIVER);
// 获取连接
if (conn == null) {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
}
// 增删改方法
public int executeUpdate(String sql, Object... objs) throws Exception {
// 获取连接
getConnection();
// 获取PreparedStatement对象
ps = conn.prepareStatement(sql);
// 循环给?赋值
for (int i = 1; i
ps.setObject(i, objs[i - 1]);
}
// 执行SQL
int count = ps.executeUpdate();
return count;
}
// 查询
public ResultSet executeQuery(String sql, Object... objs) throws Exception {
// 获取连接
getConnection();
// 获取PreparedStatement对象
ps = conn.prepareStatement(sql);
// 循环给?赋值
for (int i = 1; i
ps.setObject(i, objs[i - 1]);
}
// 执行SQL
rs = ps.executeQuery();
return rs;
}
// 关闭资源
public void closeResource() throws Exception {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
Entity实体:
import java.io.Serializable;
import java.util.Date;
public class Student implements Serializable{
/**
* 序列化标识ID
*/
private static final long serialVersionUID = 8000378773322768639L;
private Integer studentNo;
private String loginPwd;
private String studentName;
private Integer sex;
private Integer gradeId;
private String phone;
private String address;
private Date bornDate;
private String email;
private String identityCard;
public Integer getStudentNo() {
return studentNo;
}
public void setStudentNo(Integer studentNo) {
this.studentNo = studentNo;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getGradeId() {
return gradeId;
}
public void setGradeId(Integer gradeId) {
this.gradeId = gradeId;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getBornDate() {
return bornDate;
}
public void setBornDate(Date bornDate) {
this.bornDate = bornDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getIdentityCard() {
return identityCard;
}
public void setIdentityCard(String identityCard) {
this.identityCard = identityCard;
}
@Override
public String toString() {
return "Student [studentNo=" + studentNo + ", loginPwd=" + loginPwd + ", studentName=" + studentName + ", sex="
+ sex + ", gradeId=" + gradeId + ", phone=" + phone + ", address=" + address + ", bornDate=" + bornDate
+ ", email=" + email + ", identityCard=" + identityCard + "]";
}
public Student(Integer studentNo, String loginPwd, String studentName, Integer sex, Integer gradeId, String phone,
String address, Date bornDate, String email, String identityCard) {
this.studentNo = studentNo;
this.loginPwd = loginPwd;
this.studentName = studentName;
this.sex = sex;
this.gradeId = gradeId;
this.phone = phone;
this.address = address;
this.bornDate = bornDate;
this.email = email;
this.identityCard = identityCard;
}
public Student() {
}
}
Dao层接口
public interface IStudentDao {
//添加数据
public int insertStudent(Student student) throws Exception;
//修改数据
public int updateStudent(Student student) throws Exception;
//删除数据
public int deleteStudent(Integer studentNo) throws Exception;
//查询单条数据
public Student findOneStudent(Integer studentNo) throws Exception;
//查询多条
public List
}
DaoImpl实现类
public class IStudentDaoImpl extends BaseDao implements IStudentDao {
@Override
public int insertStudent(Student student) throws Exception {
//创建SQL语句
String sql="insert into Student(StudentNo,LoginPwd,StudentName,Sex,GradeId,Phone,Address,BornDate,Email,IdentityCard) Values(?,?,?,?,?,?,?,?,?,?)";
Object [] objects= {student.getStudentNo(),student.getLoginPwd(),student.getStudentName(),student.getSex(),student.getGradeId(),student.getPhone(),student.getAddress(),student.getBornDate(),student.getEmail(),student.getIdentityCard()};
int count = executeUpdate(sql, objects);
return count;
}
@Override
public int updateStudent(Student student) throws Exception {
String sql="update Student set StudentName=? where StudentNo=?";
int count = executeUpdate(sql, student.getStudentName(),student.getStudentNo());
return count;
}
@Override
public int deleteStudent(Integer studentNo) throws Exception {
String sql="delete from student where StudentNo=?";
return executeUpdate(sql, studentNo);
}
@Override
public Student findOneStudent(Integer studentNo) throws Exception {
Student student=new Student();
String sql="select * from student where StudentNo=?";
ResultSet rs = executeQuery(sql, studentNo);
if(rs!=null) {
while (rs.next()) {
student.setStudentNo(rs.getInt("studentNo"));
student.setLoginPwd(rs.getString("loginPwd"));
student.setStudentName(rs.getString("studentName"));
student.setSex(rs.getInt("sex"));
student.setGradeId(rs.getInt("gradeId"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setBornDate(rs.getDate("BornDate"));
student.setEmail(rs.getString("email"));
student.setIdentityCard(rs.getString("identityCard"));
}
}
return student;
}
@Override
public List
List
String sql="select * from student";
ResultSet rs = executeQuery(sql);
if(rs!=null) {
while (rs.next()) {
Student student=new Student();
student.setStudentNo(rs.getInt("studentNo"));
student.setLoginPwd(rs.getString("loginPwd"));
student.setStudentName(rs.getString("studentName"));
student.setSex(rs.getInt("sex"));
student.setGradeId(rs.getInt("gradeId"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setBornDate(rs.getDate("BornDate"));
student.setEmail(rs.getString("email"));
student.setIdentityCard(rs.getString("identityCard"));
stuList.add(student);
}
}
return stuList;
}
}
调用测试:
public static void main(String[] args) throws Exception {
//创建Dao层对象
IStudentDao iStudentDao=new IStudentDaoImpl();
String date="1999-8-5";
//将字符串转换为日期类型
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date bornDate = simpleDateFormat.parse(date);
/*int insertCount = iStudentDao.insertStudent(new Student(1020, "123", "徐士康", 1, 1, "120120120120", "北京", bornDate, "123@qq.com", "123456789987456213"));
System.out.println("添加结果:"+insertCount);*/
System.out.println("===============================修改=======================================================");
Student student=new Student();
student.setStudentName("余博");
student.setStudentNo(1020);
int updateCount = iStudentDao.updateStudent(student);
System.out.println("修改结果:"+updateCount);
System.out.println("===============================删除=======================================================");
int deleteCount = iStudentDao.deleteStudent(1020);
System.out.println("删除结果:"+deleteCount);
System.out.println("===============================单条查询=======================================================");
Student oneStudent = iStudentDao.findOneStudent(1000);
System.out.println(oneStudent.toString());
System.out.println("===============================多条查询=======================================================");
List
for (Student stuItem : stuList) {
System.out.println(stuItem.toString());
}
}
第六章:JDNI和连接池
一.JNDI:Java naming and Directory Interface java命名和目录接口,通过名称来定位资源,可以实现资源共享,达到松耦合效果
JNDI案例:配置Tomcat文件,达到资源共享效果
下一篇:js 下载