寫后記:
2017/11/22
最近因?yàn)榧ろ?xiàng)目需要做校園網(wǎng)的課表划滋、成績查詢功能,不得不使用模擬請求,去請求uims教務(wù)系統(tǒng)的信息勤家。
獲取后需要放在一個(gè)連有校園網(wǎng)(外網(wǎng)無法查詢)的服務(wù)器上,然后我們通過ajax請求服務(wù)器柳恐,服務(wù)器返回它在uims查完的信息伐脖。
我們用的是wamp安裝的apache服務(wù)器,然后我就把.py頁面放進(jìn)去了乐设,結(jié)果一直獲取不到url請求晓殊,
直到安裝了flask框架。
然后按照配置了 WSGI 伤提。
之前一直理解不了原理巫俺,現(xiàn)在總算是知其所以然了。
感謝? 吉林大學(xué) 計(jì)算機(jī)學(xué)院 的?姜老師
JAVA EE:標(biāo)準(zhǔn)開發(fā)架構(gòu)肿男,主要用于企業(yè)級應(yīng)用程序的開發(fā)
第一部分 Internet 與 Web 應(yīng)用
一介汹、web開發(fā)簡介
發(fā)展:靜態(tài)web->動(dòng)態(tài)web
動(dòng)態(tài)web實(shí)現(xiàn)方式:php/jsp/cgi(公共網(wǎng)關(guān)接口)
動(dòng)態(tài)web主要特點(diǎn):
1.交互式;2.數(shù)據(jù)上傳舶沛、下載嘹承、查詢、存儲(chǔ)如庭;3.信息實(shí)時(shí)傳送
企業(yè)開發(fā)架構(gòu):
二叹卷、HTML簡介
HTML:一種標(biāo)記語言,通過嵌入代碼或標(biāo)記來表明文本格式
基本框架:
<html>
? ? <head>
????????<meta charset="utf-8">
? ? ? ? <title>your title</title>
? ? </head>
? ? <body>
? ? ? ? ? ? ?<--your content -->
? ? </body>
</html>
表單:
< form action="xxx.jsp" method="">? ? ? ? ? ? ? ? ? //遞交請求的頁面
< input type="submit" name="Submit" >? ? ? ? ? ?//遞交按鈕和按鈕的索引
< input type="text" name="password">
< input type="text" name="name">
< /form>
post和get的區(qū)別
get:拼接在頁面url中坪它,限制255個(gè)字符
post:不拼接骤竹,不限制
三、Tomcat 服務(wù)器
路徑:
四往毡、簡單的程序 html+jsp
<%@? page language="java" import="java.util.*" pageEncoding="utf-8">? ?//按照學(xué)校的尿性肯定考試要默這句
<html>
<body>?
<%
out.println("<h1>并不是很有趣的JavaEE</h1>")
%>
</body>
</html>
第二部分 Servlet
一蒙揣、Servlet:Java對CGI程序的實(shí)現(xiàn)、多線程處理开瞭。服務(wù)器端程序懒震。
//其實(shí)就是負(fù)責(zé)處理http請求的程序罩息,服務(wù)器收到請求后,將請求交給servlet類處理个扰。
//servlet 處理完結(jié)果之后會(huì)交由服務(wù)器返回客戶端
二瓷炮、servlet實(shí)現(xiàn)
實(shí)現(xiàn)HttpServletResponse
客戶端每次訪問一個(gè)支持HTTP的Servlet程序時(shí),
處理請求:
Servlet引擎都將調(diào)用Servlet的service方法來進(jìn)行處理递宅。
service方法接受兩個(gè)參數(shù)娘香,
一個(gè)是用于封裝HTTP請求消息的對象,其類型為HttpServletRequest恐锣,
另一個(gè)是代表HTTP響應(yīng)消息的對象茅主,其類型為HttpServletResponse。
返回響應(yīng):
調(diào)用HttpServletResponse對象的getWriter方法可以獲得一個(gè)文本輸出流對象土榴,向這個(gè)流對象中寫入的數(shù)據(jù)將作為HTTP響應(yīng)消息的實(shí)體內(nèi)容部分發(fā)送給客戶端诀姚。
三、創(chuàng)建servlet
1.xxxx extends HttpServlet //集成httpservlet類
2.override [doGet],[doPost] //重寫httpservlet類的 處理get玷禽、post 請求的方法
3.將這個(gè)類的文件拷貝到web-inf/classes
web-inf文件夾只允許服務(wù)器訪問赫段,放入該文件夾的文件,用戶無法通過輸入url訪問(用戶端訪問)
4.在web.xml 中配置 servlet路徑
概括//考試時(shí)候這樣寫
import java.io.*
import javax.servlet.*
public class myServlet extends HttpServlet{
? ? public void doGet( HttpServletRequest req,HttpServletResponse resp )thirows IOException{
????????PrintWriter out = resp.getWriter();
? ? ? ? out.println("<h1>hahaha</h1>")
????}
}
配置
<servlet>
< servlet-name >hello</ servlet-name >
< servlet-class> org.lxh.servletdemo.HelloServlet ?<?servlet-class>
</servlet>
<servlet-mapping>
<?servlet-name?>hello< /servlet- name? >? ?// 映射路徑矢赁,出現(xiàn)下列路徑時(shí)跳轉(zhuǎn)到servlet
<?url-pattern>/hello.asp<? ?url-pattern >
</servlet-mapping>
將表單的請求交由servlet類處理
表單
<form action=" myServlet?" method="GET">? ? ? ? ? ? ? ? ? //遞交請求的頁面
< input type="submit" name="Submit" >? ? ? ? ? ?//遞交按鈕和按鈕的索引
< input type="text" name="password">
< input type="text" name="Name">
< /form>
public class myServlet extents HttpSetvlet{
????public void doGet(HttpServletRequest rq,HttpServletResponse resp) throw IOException{
? ? ? ? string password= rq.getParameter("password");
? ??????string Name= rq.getParameter("Name");
? ? ? ? PrintWriter out =resp.getWriter();
? ? ? ? out.println("<h1>"+ password +"</h1>")
????}
}
四糯笙、Servlet生命周期
servlet容器:tomcat等,控制servlet類的生命周期撩银。
什么時(shí)候?qū)嵗旱谝淮问褂酶椋蛘遷eb容器啟動(dòng)的時(shí)候(配置);
初始化:init()方法
銷毀:destory()方法 //銷毀前調(diào)用
servlet的部署:
Cookie: 把用戶的數(shù)據(jù)寫給用戶的瀏覽器(客戶端)
Session: 用戶的數(shù)據(jù)寫到用戶獨(dú)占的session中(服務(wù)器端)额获;需要客戶端的?cookie 協(xié)作够庙;會(huì)話,生命周期是一段周期(不訪問超過一定市場抄邀,服務(wù)器將其銷毀)
Application:這個(gè)就不多談了耘眨,不理解
使用:
get / setAttribute 方法存鍵值對
五、獲取初始化 = =我也不知道怎么用境肾,先記著
//寫在 myServlet里面
public void init(ServletConfig config) throws ServletException{
????this.initParam=config.getInitParameter("ref") ;//接收初始化參數(shù)
}
六剔难、獲取其他初始化對象
//寫在 myServlet doGet/doPost里面
(HttpServletRequest req,HttpServletResponse resp)throw IOExceotion
{
//Session
HttpSession ses = req.getSession();
ses.getAttribute("username");//從回話去鍵值
ses.setAttribute("name","朱陳超");//這個(gè)就不多談了
//獲取application
ServletContext application = super.getServletContext();
System.out.println (application.getRealPath("/"));
}
七、Servlet跳轉(zhuǎn)
1.客戶端跳轉(zhuǎn)
使用HttpServletResponse接口的sendRedirect()方法奥喻;
此跳轉(zhuǎn)只能傳遞session范圍的屬性偶宫,而無法傳遞request范圍的屬性;
resp.sendRedirect();
在頁面中接收session屬性? //ppt中忽然插入這個(gè)衫嵌,猝不及防= =
<%@ page contentType="text/html" pageEncoding="utf-8">//頁面配置
<html>
<body>
<h1><%=session.getAttribute("name") %></h1>
</body>
</html>
2.服務(wù)器跳轉(zhuǎn) //記不住读宙,這幾分不要了
RequestDispatcher rd = req.getRequestDispatcher("get_info.jsp");
rd.forward(req,resp) ;//服務(wù)器跳轉(zhuǎn)
敲代碼的時(shí)候百度
八、servlet處理文件的操作
1.文件讀取
doGet(HttpServletRequest req,HttpServletResponse resp){
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
String filename = "afile.txt";
String realPath = req.getRealPath(filename);
File file = new File(realPath);
if(file.exists()){
????FileReader reader = new FileReader(file);
????BufferedReader br = new? BufferedReader(reader);
????String line = null;
????while(line=br.readline()!=null){
? ? ? ? out.print("<h3>"+line+"</h3>");
????}
}else{
? ? //文件不存在
}
}?
2.文件寫
doGet(HttpServletRequest req,HttpServletResponse resp){
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
String filename = "afile.txt";
String realPath = req.getRealPath(filename);
File file = new File(realPath);
FileWriter writer = new FileWriter (file);
BufferedWriter bfw=new BufferedWriter( writer );
bfw,write(" l write");
bfw.flush();
bfw.close();
writer.close
}
3.文件上傳 // 真復(fù)雜
//表單
<form method="post" action="FileUpload" ENCTYPE="multipart/form-data">
文件:<input type="file" name="file">
<input type="submit" value="上傳" name="submit">
</form>
//servlet-doPost
//import java.io.*
//import javax.servlet.*
//import org.apache.commons.fileupload.*
public? void doPost(HttpServletRequest req,HttpServletResponse resp){
boolen isMultipart = ServletFileUpload.isMultipartContent(request);//請求是不是上傳文件
if( isMultipart?){
????FileItemFactory factory = new DiskFileItemFactory();
????ServletFileUpload upload = new ServletFileUpload(factory);
????lterator items;
????try{
? ? ? ? items = upload.parseRequest(request).iterator();//用迭代器解析request請求中的信息
? ? ? ? while(item.hashNext()){
? ? ? ? ? ? FileItem item=(Fileltem)items.next();
? ? ? ? ????if(!item.isFormFiels){
? ? ? ? ? ? //取出上傳文件的文件名
? ? ? ? ? ? String name = item.getName();
? ? ? ? ? ? String fileName = name.substring(name.lastIndexOf("\\")+1,name.length());
? ? ? ? ? ? String path=request.getRealPath("file")+File.separatorChar+fileName;
????????????//上傳
? ? ? ? ? ? File uploadFile = new File(Path)
? ? ? ? ? ? item.write(uploadedFile);
????????????}
????????}
????}
}
}
第三部分 JSP
JSP:動(dòng)態(tài)網(wǎng)站技術(shù)標(biāo)準(zhǔn)楔绞,它是在傳統(tǒng)的HTML網(wǎng)頁文檔中加入能夠生成動(dòng)態(tài)內(nèi)容的可執(zhí)行Java程序片段和JSP標(biāo)記所構(gòu)成的代碼
结闸!瀏覽器請求jsp文件時(shí)候,先由服務(wù)器執(zhí)行文件的程序段酒朵,執(zhí)行完畢后再發(fā)送給瀏覽器桦锄。
一、例子
<%@ page contentType="text/html" ; charset="Utf-8" %>//配置頁面
<%@ page language="java" %>
<%! String s1,s2,s3,s4>//定義<%! xxxxx %>
<html>
? ? <body>
????????<h1>JSP<h2>
? ? ? ? <% s1="1";s2="2";s3="3";out.println(s1+s2+s3) %>
? ? </body>
</html>
二蔫耽、應(yīng)用方式
JSP+Servlet+JDBC+JavaBeans
<%
? ? String name="zhucc"http://requset.getParameter("Name");
? ? if(name! = null)
????{
%>
? ? //這里面可以些html標(biāo)簽與<%=name%>的賦值结耀、<%%>操作
<%
????}else{
%>
? ? //這里面可以些html標(biāo)簽與<%=name%>的賦值、<%%>操作
<%
????}
%>
注釋
<-- content --> //用戶端可以看到(html注釋)
<%-- content --%>//用戶端看不到(jsp注釋)
三匙铡、<jsp : forward>
強(qiáng)制調(diào)轉(zhuǎn)請求到另外的文件如JSP图甜、Servlet或者是靜態(tài)頁面來處理并將當(dāng)前頁面的執(zhí)行停止。
1.寫法
//不傳遞參數(shù)
<jsp:forward page=" {文件路徑}? ">
//傳遞參數(shù)
<jsp:forward page=" {文件路徑}? ">
? ? <jsp:param name="KEY" value="VALUR" />
? ? ...//多個(gè)參數(shù)
</jsp:forward>
2.和response.sendRedirect的區(qū)別
<jsp : forward>
1.服務(wù)器內(nèi)部轉(zhuǎn)換
2.使用同一個(gè)請求//就是說兩個(gè)頁面可以從request.getParameter獲取同樣的參數(shù)
3.跳轉(zhuǎn)后不再執(zhí)行后面的語句
4.速度快
response.sendRedirect
1.需要在客戶端往返
2.不同的請求
3.繼續(xù)執(zhí)行后面的語句
4.速度慢
四鳖眼、包含操作 include
1.<%@include> 靜態(tài)包含
在JSP中動(dòng)態(tài)地包含入一個(gè)靜態(tài)或動(dòng)態(tài)的頁面資源黑毅,當(dāng)JSP執(zhí)行時(shí),將所包含的資源進(jìn)行處理钦讳,并將這些頁面如同在同一個(gè)JSP中一樣地運(yùn)行矿瘦、顯示、輸出愿卒。
<html>
<body>
<h1>Title</h1>
<%@include file="xxxx.jsp"? ?%>
</body>
</html>
2.<jsp:include> 動(dòng)態(tài)包含
動(dòng)態(tài)包含語句缚去,可以自動(dòng)區(qū)分被包含的頁面是靜態(tài)還是動(dòng)態(tài)。
//先分別處理被包含的頁面(jsp 動(dòng)態(tài)頁面)琼开,再將結(jié)果包含進(jìn)來
不傳遞參數(shù)
<jsp:include page=" { 文件路徑 } " flush=“true|fasle”>
傳遞參數(shù)
< jsp:include page=" { 文件路徑 } " flush=“true|fasle”>
? ? <jsp:param name="KEY" value="VALUE">
</jsp:include
五易结、<jsp:plugin>
在客戶端顯示和執(zhí)行Java,Applet或JavaBean,該動(dòng)作可以自動(dòng)檢測客戶端瀏覽器的類型柜候,當(dāng)一個(gè)plugin不能被加載時(shí)該動(dòng)作還可以自動(dòng)下載和安裝該plugin搞动,并使用動(dòng)作將文本插入到頁面中。該動(dòng)作還支持很多屬性
//不寫這個(gè)了改橘,暫時(shí)沒體會(huì)到有啥用滋尉,需要的時(shí)候再查
六、JAVABeam
1.操作
<jsp:params>:為Java applet 或JavaBean 定義一組參數(shù)
<jsp:useBean>:定義一個(gè)在JSP中使用的JavaBean
<jsp:getProperty>:從指定的JavaBea中獲取一個(gè)屬性值
<jsp:setProperty>:設(shè)定一個(gè)JavaBean實(shí)例的某個(gè)屬性值
2.示例
<jsp:useBean id = "? formMail " class = " util.formMail " >
? ? <jsp:setProperty name="formMail" property="*" />
</jsp:useBean>
七飞主、操作錯(cuò)誤頁面
<%@page errorPage="error.jsp" %> //程序一單出現(xiàn)錯(cuò)誤則跳轉(zhuǎn)到該頁面
error.jsp
<%@page languag="java" contentType="text/html" pageEncoding="utf-8"? %>
<%@page isErrorPage="true" %>
<h1>程序出現(xiàn)了錯(cuò)誤</h1>
八狮惜、JSP內(nèi)置對象的四種屬性范圍
pageContext: 只在一個(gè)頁面中保存屬性,跳轉(zhuǎn)后無效
request: 只在一次請求中保存碌识,服務(wù)器跳轉(zhuǎn)后依然有效
session: 在一次會(huì)話范圍中無論如何跳轉(zhuǎn)都有效碾篡,但是新開瀏覽器無效
application: 在整個(gè)服務(wù)器上保存,所有的用戶都可以使用
1.操作
public void setAttribute(String keyName,Object keyValue);//添加
public Object getAttribute(String name);//獲取
Date aDay=(Date)pageContext.getAttribute("birthday");
public void removeAttribute(String name);//刪除
pageContext 使用<jsp:forward page="">是不好使的筏餐,因?yàn)橹荒墚?dāng)前頁面使用
//不是很理解开泽,那用變量不是都可以解決嘛,有啥作用魁瞪?穆律?惠呼??峦耘?
至于request和session和application剔蹋,很好理解,就不多談了辅髓。
(href 跳轉(zhuǎn) 屬于客戶端調(diào)準(zhǔn)泣崩, request 不是同一個(gè))
2.表單傳參,request獲取
<form action = "xxx.jsp" method = "post">
<input type="text" name="uname">
<input type="submit" value="遞交">
</form>
//我的xxx.jsp
<%
request.setCharacterEncoding("utf-8");
var name =request.getParameter("name");
%>
<h1><%=name%></h1>
九洛口、response常用方法
1.設(shè)置響應(yīng)頭
response.setHeader("KEY","VALUE");
2.跳轉(zhuǎn)
response.sendRedirect(""hello.html);
3.操作Cookie
//創(chuàng)建cookie
<%
Cookie c1 = new Cookie("Name","ZCC");//創(chuàng)建cookie
c1.setMaxAge(60);//設(shè)置cookie保存60秒矫付;
response.addCookie(c1);//向客戶端增加cookie
%>
//獲取cookie
<%
Cookie c[]=request.getCookie()://獲取全部cookie
c[0].getName();
c[0].getValue();
%>
十、Session常用方法
當(dāng)一個(gè)用戶連接到服務(wù)器之后第焰,服務(wù)器會(huì)自動(dòng)為此session自動(dòng)分配一個(gè)不會(huì)重復(fù)的Session Id买优,服務(wù)器依靠這些不同的Session Id來區(qū)分每一個(gè)不同的用戶。
1.獲取session id
string id = session.getId();
2.是否是新的session (新用戶)
boolean isNew = session.isNew();
3...取得用戶創(chuàng)建時(shí)間什么的
就不多談了樟遣,用到baidu
十一而叼、servlet與jsp 的開發(fā)模式 // 究極盜圖
1.Model 1
2.Model 2
第四部分JDBC
一、JDBC的任務(wù)
1.同一個(gè)數(shù)據(jù)庫建立連接
2.向數(shù)據(jù)庫發(fā)送SQL語句
3.處理數(shù)據(jù)庫返還的結(jié)果
二豹悬、JDBC的驅(qū)動(dòng)管理器
驅(qū)動(dòng)管理器是【DriverManage類】葵陵,它在數(shù)據(jù)庫和用戶驅(qū)動(dòng)器間工作,在數(shù)據(jù)庫和適合的驅(qū)動(dòng)器間建立聯(lián)系瞻佛。真正進(jìn)行數(shù)據(jù)庫連接的是【Driver】類中的【connect()】方法脱篙。
三、用SQL指令操作數(shù)據(jù)庫
1.載入JDBC驅(qū)動(dòng)程序
Class.forName("com.mysql.jdbc.Driver");//所選定驅(qū)動(dòng)程序的名稱
2.連接到DBMS
getConnection();
getConnection(String url);
getConnection(String url,Properties info);
getConnection(String url,String user,String password);
String url="jdbc:mysql:// localhost:3306/graduation_design"
3.創(chuàng)建并執(zhí)行語句
通過Statement對象發(fā)送SQL語句伤柄,返回查詢結(jié)果绊困。
Statement對象用于執(zhí)行簡單的SQL語句,也就是沒有參數(shù)的SQL語句适刀;
PreparedStatement對象用于執(zhí)行需要重復(fù)執(zhí)行的預(yù)編譯過的SQL語句秤朗;
CallableStatement對象用于執(zhí)行一個(gè)數(shù)據(jù)庫的存儲(chǔ)過程。
//創(chuàng)建Statement
Statement stmt = connect.createStatment();
//
executeQuery( String sql );//執(zhí)行給定的SQL查詢語句笔喉,返回ResultSet對象取视。
executeUpdate( String sql );//執(zhí)行給定的SQL更新語句,返回INSERT常挚、UPDATE或DELETE語句的行計(jì)數(shù)作谭,或者返回0表示不返回任何內(nèi)容。
execute( String sql ); //執(zhí)行給定的SQL查詢語句奄毡,該語句可能返回多個(gè)結(jié)果折欠。
//關(guān)閉
stmt.close();
4.處理DBMS返回的數(shù)據(jù)
JDBC接收查詢結(jié)果是通過ResultSet對象實(shí)現(xiàn)的//結(jié)果集
用戶可以通過get方法來訪問
//元數(shù)據(jù):數(shù)據(jù)信息
DatabaseMetaData dbmd=connection.getMetaData();
5.終止與DBMS的連接
connection.close();
6.DEMO
String diver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/graduation_design"
String user="root";
String password="";
//第一步:載入JDBC驅(qū)動(dòng)程序
Class.forName(driver);
//第二步:連接到數(shù)據(jù)庫
Connection connect=DriverManage.getConnection(url,user,password);
//第三部:創(chuàng)建Statement對象
Statement stmt = connect.createStatement();
//獲取查詢結(jié)果
String query = “SELECT * FROM namelist”;
ResultSet result =stmt.executeQuery(query);
ResultSetMetaData md=result.getMetaData();
StringBuffer s =new StringBuffer();
for(int i=1;i<=md.getColumnCount;i++){
s.append(md.getColumnName(i));
}
//關(guān)閉連接
result.close();
stmt.close();
connect.close();
第五部分 JavaBean概述
javaBean:簡單地說JavaBean就是普通的Java類,在遵循JavaBean特定規(guī)范下對功能進(jìn)行封裝
一锐秦、demo
public class SimpleBean(){
private string name;
public void setName(String name){this.name=name}
public String getName(){return this.name}
}
//每一個(gè)屬性都要有public 的 setter和getter
javaBean保存著 classes文件夾里面
二咪奖、jsp使用javaBean
1.import
<%@page import="cn.mldn.*" %>
<%
SimpleBean simple = new SimpleBean() ;
simple.setName("李興華") ;
%>
<%=simple.getName()%>
2.使用<jsp:useBean>
<jsp:useBean id="實(shí)例化對象名稱" scope="保存范圍" class="包.類名" />
<jsp:useBean id="simple" scope="page" class="cn.mldn.lxh.demo.SimpleBean" />
<%
simple.setName("ZCC");
%>
三、javaBean與表單
1.表單
<form action="input_bean.jsp" method="post">
? ? <input type="text" name="name">
? ? <input type="submit" value="遞交">
</form>
2.jsp接收表單內(nèi)容
<%@page import="cn.mldx.lxh.demo.*" pageEncoding="utf-8" %>
<% request.setCharacterEncoding("utf-8")%>
<%
SimpleBean simple=new SimpleBean();
simple.setName(request.getParameter("name"));
%>
3.設(shè)置屬性的參數(shù)
<jsp:useBean id="simple" scope="page" class="cn.mldn.lxh.demo.SimpleBean"/>
<jsp:setProperty name="simple" property="name" param="name"/>
4.取得屬性
<h1>姓名: < jsp:getProperty name="simple" property="age"/> <h1>
5.刪除javaBean
1)刪除page范圍
pageContext.removeAttribute(JAVABEAN的名稱)农猬;
2)刪除request赡艰、session售淡、application范圍
request.removeAttribute(JAVABEAN的名稱)斤葱;
session .removeAttribute(JAVABEAN的名稱);
application .removeAttribute(JAVABEAN的名稱)揖闸;
—— END ——