这里面的return含有一些细节知识:
例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别
JAVASCRIPT在事件中调用函数时用return返回值实际上是对window.event.returnvalue进行设置。
而该值决定了当前操作是否继续。
当返回的是true时,将继续操作。
当返回是false时,将中断操作。
而直接执行时(不用return)。将不会对window.event.returnvalue进行设置
所以会默认地继续执行操作
详细说明如下:
例如:
当在 <a href="abc.htm" onclick="return add_onclick()">Open</a> 中
如果函数 add_onclick() 返回 true, 那么 页面就会打开 abc.htm
否则, (返回 false), 那么页面不会跳转到 abc.htm, 只会执行你的 add_onclick() 函数里的内容. (add_onclick函数中控制页面转到 abc.htm除外
)
而 <a href="abc.htm" onclick="add_onclick()">Open</a>
不管 add_onclick() 返回什么值, 都会在执行完 add_onclick 后打开页面 abc.htm
另外补充:
onclick事件时就相当于onclick="return true/false"
例:
function check()
{
if(obj.value=="" )
{
window.alert("不能为空!");
obj.focus();
return false;
}
return true;
}
调用方法返回true时才提交表单,反之则不提交,这是submit按钮
------------------------------------------------------------------------------------------
调用js函数不需要return,但是表单却无法提交,所以在js函数中加上一句话
例:
<script language="javascript">
function check()
{
if(obj.value=="" )
{
window.alert("不能为空!");
obj.focus();
return false;
}
document.myform.submit();
return true;
}
</script>
注:document.myform.submit();要在return true前
关于javascript中的 return false和return true
return 是javascript里函数返回值的关键字,
一个函数内处理的结果可以使用return 返回,
这样在调用函数的地方就可以用变量接收返回
结果。return 关键字内任何类型的变量数据或表达式
都可以进行返回,甚至什么都不返回也可以比如
function NullReturn(IsNull)
{
if(IsNull==true)
{
return;
}
}
这样写也是可以的,这里的意思是返回空(null)
所以有的时候return 的作用就是用来终止函数执行。
比如
<html>
<head>
<title>return验证测试</title>
<script language="javascript">
function Login_Click()
{
if(document.form1.UsName.value=="")
{
alert('用户名为空');
}
if(document.form1.UsPwd.value=="")
{
alert('密码为空');
}
alert('登陆成功');
}
</script>
</head>
<body>
<form name="form1">
<input type="text" name="UsName" >用户名
<input type="password" name="UsPwd">密码
<input type="button" name="Login" onClick="Login_Click();" >登陆
</form>
</body>
</html>
不加return 的情况
加return
<html>
<head>
<title>return验证测试</title>
<script language="javascript">
function Login_Click()
{
if(document.form1.UsName.value=="")
{
alert('用户名为空');
return;
}
if(document.form1.UsPwd.value=="")
{
alert('密码为空');
return;
}
alert('登陆成功');
}
</script>
</head>
<body>
<form name="form1">
<input type="text" name="UsName" >用户名
<input type="password" name="UsPwd">密码
<input type="button" name="Login" onClick="Login_Click();" >登陆
</form>
</body>
</html>
运行就会发现加return 和不加return 的区别,
最简单的测试办法,上面的两个例子什么都不输入直接登陆,楼就明白了。
不加return的现象是先提示用户名没输入,然后提示密码没输入;加了return之后遇到一个没输入之后就不再继续检测
return false表示返回一个false值,也就是说提交是不成功的,就是不会提交上去。
return true表法返回一个true值,也就是提交了,不管你输入没有输入值,都会提交到action指定页面。
实例1:
//数据库的名字是"mydatebase.db"
var sqlite3 = require('sqlite3').verbose();
var database;
var database =
new sqlite3.Database('mydatebase.db');
//database = new sqlite3.Database("mydatebase.db", function(e){
// if (err) throw err;
//});
//也可以使用内存型,数据不会永久保存
//database = new sqlite3.Database(":memory:", function(e){
// if (err) throw err;
//});
console.log("111111111122222");
/*
database.run("CREATE TABLE foo7 (id INT,name CHAR(50))", function(e){
if(e !== null){
throw e;
}
//循环生成sql语句,批次插入多条数据
var sql = "";
var temp = "";
for(var i = 0 ; i < 500; i ++){
temp = "name"+i;
//sql += 'INSERT INTO foo6(id,name) VALUES(' + i + ' ,' +temp + ');'
sql += 'INSERT INTO foo7(id,name) VALUES(' + i + ' ,"boy345");'
}
database.exec(sql);
});
*//*
database.run("drop TABLE foo4 ", function(e){
if(e !== null){
throw e;
}
});
*/ console.log("222222222222");
//Database#each(' select * from foo ', [param,
], [callback], [complete]);
//database.all("select * from foo where id=?", idvalue, function (err, row) {});
database.all("select * from foo7 where id < 10 ",
function (err, rows) {
console.log(rows);
});
database.each(" select * from foo2 where id < 50 ",
function(err, row) {
//console.log(row.id + ": " + row.name);
});
console.log("333333333333333322222");
实例2:
//数据库的名是"mydatebase.db"
//var sqlite3 = require("sqlcipher");
var sqlite3 = require("sqlite3");
//创建数据库
var database =
new sqlite3.Database("mydatebase.db",
function(err){
if (err){
console.log("new database error,",err.message);
}
else{
console.log("new database success");
//创建表
database.run("create table if not exists sharewaf_data(time NUMERIC, domain TEXT, ip TEXT, lon_lat TEXT, address TEXT, url TEXT, type TEXT, agent TEXT)",
function(err){
if(err){
console.log("create database error,",err.message);
}
else{
console.log("create database success");
//插入数据
database.run("insert into sharewaf_data(time, domain, ip, lon_lat, address, url, type, agent) VALUES(?,?,?,?,?,?,?,?)",["time22", "domain22", "ip22", "lon_lat22", "taiyuan22", "url22", "type", "agent"],
function(err){
if(err){
console.log("insert data error,",err.message);
}
else{
console.log("insert data success");
//查询
database.all("select * from sharewaf_data",
function(err, rows) {
if(err){
console.log("select from sharewaf_data error,",err.message);
}
else{
console.log(rows);
}
});
}
});
}
});
}
});
nodejs与sqlite
//打开数据库
var db =
new sqlite3.Database('xx.db');
// 关闭数据库
db.close();
db.run('xx');
// 数据库对象的run函数可以执行任何的SQL语句,该函数一般不用来执行查询
// create alter 之类的
增:
var stmt = db.prepare("INSERT OR REPLACE INTO note (cdate, content) VALUES (?,?)");
stmt.run(data.cdate, data.content);
stmt.finalize();
删:
db.prepare("DELETE from note where cdate =?");
stmt.run(data.cdate);
stmt.finalize();
改:
var stmt = db.prepare("UPDATE note set content=? where cdate =?");
stmt.run(data.content, data.cdate);
stmt.finalize();
查:
db.each("SELECT rowid AS id, thing FROM Stuff",
function(err, row) {
console.log(row.id + ": " + row.thing);
});
});
// or
db.all("SELECT xxx",
function (err, res){});
// 使用
先把库下载到node_modules npm install sqlite3 --save
1.引入sqlite3库
var sqlite3 = require('sqlite3');
// or var sqlite3 = require("sqlite3").verbose();
var db =
new sqlite3.Database(file);
db.serialize(
function() {
//Do stuff
db.run("CREATE TABLE Stuff (thing TEXT)");
var stmt = db.prepare("INSERT INTO Stuff VALUES (?)");
for(
var i = 0;i<xx;i++){
stmt.run('xx');
}
stmt.finalize();
});
db.close();
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>
<title>WEB页面导出为EXCEL文档的方法</title>
</head>
<body>
<table id="tableExcel" width="100%" border="1" cellspacing="0" cellpadding="0">
<tr>
<td colspan="5" align="center">WEB页面导出为EXCEL文档的方法</td>
</tr>
<tr>
<td>列标题1</td>
<td>列标题2</td>
<td>列标题3</td>
<td>列标题4</td>
<td>列标题5</td>
</tr>
<tr>
<td>aaa</td>
<td>bbb</td>
<td>ccc</td>
<td>ddd</td>
<td>eee</td>
</tr>
<tr>
<td>AAA</td>
<td>BBB</td>
<td>CCC</td>
<td>DDD</td>
<td>EEE</td>
</tr>
<tr>
<td>FFF</td>
<td>GGG</td>
<td>HHH</td>
<td>III</td>
<td>JJJ</td>
</tr>
</table>
<input type="button" onclick="javascript: method1('tableExcel');" value="第一种方法导入到EXCEL">
<input type="button" onclick="javascript: method2('tableExcel');" value="第二种方法导入到EXCEL">
<input type="button" onclick="javascript: getXlsFromTbl('tableExcel', null);" value="第三种方法导入到EXCEL">
<SCRIPT LANGUAGE="javascript">
function method1(tableid) {//整个表格拷贝到EXCEL中
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
//激活当前sheet
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
//把表格中的内容移到TextRange中
sel.select();
//全选TextRange中内容
sel.execCommand("Copy");
//复制TextRange中内容
oSheet.Paste();
//粘贴到活动的EXCEL中
oXL.Visible = true;
//设置excel可见属性
}
function method2(tableid) //读取表格中每个单元到EXCEL中
{
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
//激活当前sheet
var Lenr = curTbl.rows.length;
//取得表格行数
for (i = 0; i < Lenr; i++) {
var Lenc = curTbl.rows(i).cells.length;
//取得每行的列数
for (j = 0; j < Lenc; j++) {
oSheet.Cells(i + 1, j + 1).value = curTbl.rows(i).cells(j).innerText;
//赋值
}
}
oXL.Visible = true;
//设置excel可见属性
}
function getXlsFromTbl(inTblId, inWindow) {
try {
var allStr = "";
var curStr = "";
//alert("getXlsFromTbl");
if (inTblId != null && inTblId != "" && inTblId != "null") {
curStr = getTblData(inTblId, inWindow);
}
if (curStr != null) {
allStr += curStr;
}
else {
alert("你要导出的表不存在!");
return;
}
var fileName = getExcelFileName();
doFileExport(fileName, allStr);
}
catch (e) {
alert("导出发生异常:" + e.name + "->" + e.description + "!");
}
}
function getTblData(inTbl, inWindow) {
var rows = 0;
//alert("getTblData is " + inWindow);
var tblDocument = document;
if (!!inWindow && inWindow != "") {
if (!document.all(inWindow)) {
return null;
}
else {
tblDocument = eval(inWindow).document;
}
}
var curTbl = tblDocument.getElementById(inTbl);
var outStr = "";
if (curTbl != null) {
for (var j = 0; j < curTbl.rows.length; j++) {
//alert("j is " + j);
for (var i = 0; i < curTbl.rows[j].cells.length; i++) {
//alert("i is " + i);
if (i == 0 && rows > 0) {
outStr += " \t";
rows -= 1;
}
outStr += curTbl.rows[j].cells[i].innerText + "\t";
if (curTbl.rows[j].cells[i].colSpan > 1) {
for (var k = 0; k < curTbl.rows[j].cells[i].colSpan - 1; k++) {
outStr += " \t";
}
}
if (i == 0) {
if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) {
rows = curTbl.rows[j].cells[i].rowSpan - 1;
}
}
}
outStr += "\r\n";
}
}
else {
outStr = null;
alert(inTbl + "不存在!");
}
return outStr;
}
function getExcelFileName() {
var d = new Date();
var curYear = d.getYear();
var curMonth = "" + (d.getMonth() + 1);
var curDate = "" + d.getDate();
var curHour = "" + d.getHours();
var curMinute = "" + d.getMinutes();
var curSecond = "" + d.getSeconds();
if (curMonth.length == 1) {
curMonth = "0" + curMonth;
}
if (curDate.length == 1) {
curDate = "0" + curDate;
}
if (curHour.length == 1) {
curHour = "0" + curHour;
}
if (curMinute.length == 1) {
curMinute = "0" + curMinute;
}
if (curSecond.length == 1) {
curSecond = "0" + curSecond;
}
var fileName = "leo_zhang" + "_" + curYear + curMonth + curDate + "_" + curHour + curMinute + curSecond + ".csv";
//alert(fileName);
return fileName;
}
function doFileExport(inName, inStr) {
var xlsWin = null;
if (!!document.all("glbHideFrm")) {
xlsWin = glbHideFrm;
}
else {
var width = 6;
var height = 4;
var openPara = "left=" + (window.screen.width / 2 - width / 2)
+ ",top=" + (window.screen.height / 2 - height / 2)
+ ",scrollbars=no,width=" + width + ",height=" + height;
xlsWin = window.open("", "_blank", openPara);
}
xlsWin.document.write(inStr);
xlsWin.document.close();
xlsWin.document.execCommand('Saveas', true, inName);
xlsWin.close();
}
</SCRIPT>
</body>
</html>
Js操作Excel常用方法
1.创建一个新Excel表格
var XLObj = new ActiveXObject("Excel.Application");
var xlBook = XLObj.Workbooks.Add; //新增工作簿
var ExcelSheet = xlBook.Worksheets(1); //创建工作表
2.保存表格
ExcelSheet.SaveAs("C:\\TEST.XLS");
3.使 Excel 通过Application 对象可见
ExcelSheet.Application.Visible = true;
4.打印
xlBook.PrintOut;
或者:
ExcelSheet.PrintOut;
5.关闭
xlBook.Close(savechanges=false);
或者:
ExcelSheet.Close(savechanges=false);
6.结束进程
ExcelSheet.Application.Quit();
或者:
XLObj.Quit();
XLObj=null;
function endXlsObj(){
oXL.UserControl = true;
oXL=null;
oWB=null;
activeSheet=null;
//结束excel进程,退出完成
idTmr = window.setInterval("Cleanup();",1);
}
function Cleanup() {
window.clearInterval(idTmr);
CollectGarbage();
}
7.页面设置
ExcelSheet.ActiveSheet.PageSetup.Orientation = 2;
ExcelSheet.ActiveSheet.PageSetup.LeftMargin= 2/0.035; //页边距 左2厘米
ExcelSheet.ActiveSheet.PageSetup.RightMargin = 3/0.035; //页边距 右3厘米,
ExcelSheet.ActiveSheet.PageSetup.TopMargin = 4/0.035; //页边距 上4厘米,
ExcelSheet.ActiveSheet.PageSetup.BottomMargin = 5/0.035; //页边距 下5厘米
ExcelSheet.ActiveSheet.PageSetup.HeaderMargin = 1/0.035; //页边距 页眉1厘米
ExcelSheet.ActiveSheet.PageSetup.FooterMargin = 2/0.035; //页边距 页脚2厘米
ExcelSheet.ActiveSheet.PageSetup.CenterHeader = "页眉中部内容";
ExcelSheet.ActiveSheet.PageSetup.LeftHeader = "页眉左部内容";
ExcelSheet.ActiveSheet.PageSetup.RightHeader = "页眉右部内容";
ExcelSheet.ActiveSheet.PageSetup.LeftFooter = "页脚左部内容";
ExcelSheet.ActiveSheet.PageSetup.RightFooter = "页脚右部内容"; ExcelSheet.ActiveSheet.PageSetup.CenterHeader = "&\"宋体,加粗\"&18长天公司" + date1 + "至" + date2 + "(施工图)项目进度检查表";
ExcelSheet.ActiveSheet.PageSetup.RightHeader = "&D";
ExcelSheet.ActiveSheet.PageSetup.PrintGridlines = true;
ExcelSheet.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1";
ExcelSheet.ActiveSheet.PageSetup.Zoom = 75;
8.对单元格操作,带*部分对于行,列,区域都有相应属性
ExcelSheet.ActiveSheet.Cells(row,col).Value = "内容"; //设置单元格内容
ExcelSheet.ActiveSheet.Cells(row,col).Borders.Weight = 1; //设置单元格边框*()
ExcelSheet.ActiveSheet.Cells(row,col).Interior.ColorIndex = 1; //设置单元格底色*(1-黑色,
2-白色,3-红色,4-绿色,5-蓝色,6-黄色,7-粉红色,8-天蓝色,9-酱土色..可以多做尝试)
ExcelSheet.ActiveSheet.Cells(row,col).Interior.Pattern = 1; //设置单元格背景样式*(1-无,
2-细网格,3-粗网格,4-斑点,5-横线,6-竖线..可以多做尝试)
ExcelSheet.ActiveSheet.Cells(row,col).Font.ColorIndex = 1; //设置字体颜色*(与上相同)
ExcelSheet.ActiveSheet.Cells(row,col).Font.Size = 10; //设置为10号字*
ExcelSheet.ActiveSheet.Cells(row,col).Font.Name = "黑体"; //设置为黑体*
ExcelSheet.ActiveSheet.Cells(row,col).Font.Italic = true; //设置为斜体*
ExcelSheet.ActiveSheet.Cells(row,col).Font.Bold = true; //设置为粗体*
ExcelSheet.ActiveSheet.Cells(row,col).ClearContents; //清除内容*
ExcelSheet.ActiveSheet.Cells(row,col).WrapText=true; //设置为自动换行*
ExcelSheet.ActiveSheet.Cells(row,col).HorizontalAlignment = 3; //水平对齐方式枚举* (1-常规,
2-靠左,3-居中,4-靠右,5-填充 6-两端对齐,7-跨列居中,8-分散对齐)
ExcelSheet.ActiveSheet.Cells(row,col).VerticalAlignment = 2; //垂直对齐方式枚举*(1-靠上,
2-居中,3-靠下,4-两端对齐,5-分散对齐)
//行,列有相应操作:
ExcelSheet.ActiveSheet.Rows(row).
ExcelSheet.ActiveSheet.Columns(col).
ExcelSheet.ActiveSheet.Rows(startrow+":"+endrow). //如Rows("1:5")即1到5行
ExcelSheet.ActiveSheet.Columns(startcol+":"+endcol). //如Columns("1:5")即1到5列
//区域有相应操作:
XLObj.Range(startcell+":"+endcell).Select;
//如Range("A2:H8")即A列第2格至H列第8格的整个区域
XLObj.Selection.
//合并单元格
XLObj.Range(startcell+":"+endcell).MergeCells = true;
//如Range("A2:H8")即将A列第2格至H列第8格的整个区域合并为一个单元格
或者:
XLObj.Range("A2",XLObj.Cells(8, 8)).MergeCells = true;
9.设置行高与列宽
ExcelSheet.ActiveSheet.Columns(startcol+":"+endcol).ColumnWidth = 22;
//设置从firstcol到stopcol列的宽度为22
ExcelSheet.ActiveSheet.Rows(startrow+":"+endrow).RowHeight = 22;
//设置从firstrow到stoprow行的宽度为22
1、通过注解ModelAttribute直接映射表单中的参数到POJO。在from中的action写提交的路径,在input的name写参数的名称。
复制代码
package com.demo.model;
public class user {
private String username;
private String password;
private int nsex;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setNsex(int nsex) {
this.nsex = nsex;
}
public int getNsex() {return nsex;}
}
复制代码
复制代码
<%--
Created by IntelliJ IDEA.
User: wym
Date: 2019/10/8
Time: 23:17
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"/> <br><br>
密码:<input type="password" name="password"/> <br><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
复制代码
复制代码
package com.demo.controller;
import com.demo.model.user;
import com.demo.service.Userservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
private Userservice userService;
@RequestMapping(value="/login", method= RequestMethod.POST)
public String hello(@ModelAttribute user u, HttpSession session){
session.setAttribute("user", u);
user user = userService.findbyname(u.getUsername());
if(user == null)
return "loginfail";
else if(!user.getPassword().equals(u.getPassword()))
return "falsepaswd";
else
return "helloworld";
}
}
复制代码
注意!!这里只有input的参数name名称和pojo中的成员域名称完全相同才可以通过@ModelAttribute进行直接映射,否则无法被赋值的参数将会以默认值的方式呈现。
2.显然不可能form获取的内容总是某个pojo的属性,完全有可能是单独出现的。这时可以使用@RequestParam获取参数。
复制代码
1 public String hello(@RequestParam(value="username") String A, @RequestParam(value="password") String B, HttpSession session){
2 session.setAttribute("a", A);
3 session.setAttribute("b", B);
4 user user = userService.findbyname(A);
5 if(user == null)
6 return "loginfail";
7 else if(!user.getPassword().equals(B))
8 return "falsepaswd";
9 else
10 return "helloworld";
11
12 }
复制代码
这时候只需跟在@RequestParam后的参数和form的name一致即可,String的名称可以随便取。
3.可以直接啥注解都不加,只需保证参数名称和form的name即可
复制代码
public String hello( String username, String password, HttpSession session){
session.setAttribute("a", username);
session.setAttribute("b", password);
user user = userService.findbyname(username);
if(user == null)
return "loginfail";
else if(!user.getPassword().equals(password))
return "falsepaswd";
else
return "helloworld";
}
复制代码
4.通过HttpServletRequest接收
复制代码
public String hello( HttpServletRequest req, HttpSession session){
username=req.getParameter("username");
password=req.getParameter("password");
session.setAttribute("a", username);
session.setAttribute("b", password);
user user = userService.findbyname(username);
if(user == null)
return "loginfail";
else if(!user.getPassword().equals(password))
return "falsepaswd";
else
return "helloworld";
}
复制代码
此外,还有一些其他的方式接受数据,例如通过@RequestBody等方式传递json数据。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import top.huashengshu.springsecuritydemoimooc.entity.User;
@Controller
public class UserController {
@RequestMapping(value = "/user/{id}")
public User queryWhenId(@PathVariable(name = "id") Integer id){
User user=new User();
/*
假设经过service获得到了一个User对象
*/
user.setId(id);
user.setName("张三");
user.setAge(18);
user.setSex(1);
return user;
}
}
当我们使用Restful风格的代码并且想要获取url中携带的参数时,
比如/user/id 获取其中的id 参数就可以使用 @PathVariable注解
@PathVariable(name = "id") Integer id 来获取其中的id数据,如果不加name="xxx"则默认使用变量名来获取
比如上面的案例可以直接使用@PathVariable Integer id
其中的name作用是获取别名参数
也可以通过@PathVariable(name = "id") Integer keyname
将url中的id数据赋值给keyname变量
另外还可以加一个require=true表示这个参数必须要有不能为null
@PathVariable(required = true,name = "id") Integer id
另外在@RequestMapping注解可以在url中使用正则表达式以上面的controller为例子,我们想要获取的id是数字类型的我们可以这样做,在@RequestMapping注解中这样使用加入正则 通过 冒号 “ : ”加入正则来限制输入的参数
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import top.huashengshu.springsecuritydemoimooc.entity.User;
@Controller
public class UserController {
@RequestMapping(value = "/user/{id:\\d+}")
public User queryWhenId(@PathVariable(required = true,name = "id") Integer id){
User user=new User();
/*
假设经过service获得到了一个User对象
*/
user.setId(id);
user.setName("张三");
user.setAge(18);
user.setSex(1);
return user;
}
}
@RequestMapping还可以指定RESTful所使用的http方法,通过method=RequestMethod.GET 或者DELETE或POST或PUT
分别代码查询请求GET、删除请求DELETE、增加请求POST、修改请求PUT 来指定Restful中的4中http方法
@Controller
public class UserController {
@RequestMapping(value = "/user/{id:\\d+}",method = RequestMethod.GET)
public User queryWhenId(@PathVariable(required = true,name = "id") Integer id){
User user=new User();
/*这里写逻辑
假设经过service获得到了一个User对象
*/
return user;
}
}
SpringBoot获取URL中的数据和请求的参数,有两种方式,一种是:@PathVariable,获取URL中的参数另一种是:@RequestParam,获取请求参数值
@PathVariable和@RequestParam
@PathVariable是从路径里面去获取变量,也就是把路径当做变量。
@RequestParam是从请求里面获取参数。
如:url:http://localhost:8080/test_mobile/test?a=777&b=888&c=999
如果你要得到?后面的参数(a、b、c)的值,则需要使用@RequestParam进行方法里参数的注解,当然springmvc默认的参数注解就是它。
例: @RequestMapping(value = "/test_mobile/test", method = RequestMethod.GET)
public String list(Model model,@RequestParam String a) { //当然可以不加,springmvc默认的
System.out.println(a);
}
如果“test_mobile”这个字符串需要后台获取到,使用@PathVariable
例:
@RequestMapping(value = "/{qqqqq}/test", method = RequestMethod.GET)
public String list(Model model,@PathVariable("qqqqq") String aaaa) {
//这里只要满足value中的路径结构正确,注解后面保证名称一致,就可以得到{qqqqq}占位符所占的值。
System.out.println(aaaa);
}
第一种:@PathVariable
package com.hua.myfirst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//@Controller + @Responsebody =@ RestController
@RestController
@RequestMapping("/test")
public class HelloConteoller {
@Autowired
private WomanConfig womanConfig;
//不同的链接访问同一个接口
@GetMapping("/hello/{id}")
public String hello(@PathVariable("id") Integer id) {
return "id:" + id ;
}
}
启动成功,
打开链接:http:
//127.0.0.1:8080/v1/test/hello/100
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
//@Controller + @Responsebody =@ RestController
@RestController
@RequestMapping("/test")
public class HelloConteoller {
@Autowired
private WomanConfig womanConfig;
//不同的链接访问同一个接口
@GetMapping("/hello")
public String hello(@RequestParam("id") Integer id) {
return "id:" + id ;
}
}
启动成功,
打开链接:http://127.0.0.1:8080/v1/test/hello?id=100
@RequestParam进阶:
使用@RequestParam(value = “id”, required = false, defaultValue = "0"设置非必填参数,以及默认值
//不同的链接访问同一个接口
@GetMapping("/hello")
public String hello(@RequestParam(value = "id", required = false, defaultValue = "0") Integer myID) {
return "id:" + myID ;
}
启动成功,
打开链接:http://127.0.0.1:8080/v1/test/hello 默认值为0
Layui table 示例
<link rel="stylesheet" href="lib/layui/css/layui.css" media="all">
<table id="demo" lay-filter="test"></table>
<script src="lib/layui/layui.js"></script>
<script>
layui.use('table', function () {
var table = layui.table;
//第一个实例
table.render({
elem: '#demo'
, height: 312
// , url: '/demo/table/user/' //数据接口
, url: 'common/Getdatatwo.ashx'
, page: true //开启分页
, edit: true
, cols: [[ //表头
{ checkbox: true },
// { checkbox: true,type: 'checkbox', width: 100, title: '选择' },
// { type: 'checkbox', width: 100, title: '选择' },
// { field: 'ID', title: 'ID', width: 80, sort: true, fixed: 'left' }
, { field: 'yuefen', title:'月份', width: 80 }
, { field: "state", title: "状态", width: 80, sort: true }
, { field: "state2", title: "状态2", width: 80, event: 'setSign', style: 'cursor: pointer;' }
, { field: "empname", title: "操作员" , width: 177 ,edit:true }
, { field: "createdate", title: "时间", width: 180, sort: true }
, { fixed: 'right', width: 250, align: 'center', toolbar: '#barDemo' } //这里的toolbar值是模板元素的选择器
]]
//*********************************
, page: { theme: '#409eff', prev: '上一页', groups: 8, next: '下一页', layout: ['count', 'prev', 'page', 'next'] }
//********************************
});
//*******************************
//监听行单击事件
table.on('row(test)', function (obj) {
// console.log(obj.tr) //得到当前行元素对象
// console.log(obj.data) //得到当前行数据
// alert(obj.data.yuefen);
//obj.del(); //删除当前行
//obj.update(fields) //修改当前行数据
});
//监听行双击事件
table.on('rowDouble(test)', function (obj) {
//obj 同上
});
//监听复选框选择
table.on('checkbox(test)', function (obj) {
alert(obj.checked);
alert(obj.data.ID);
console.log(obj.checked); //当前是否选中状态
// console.log(obj.data); //选中行的相关数据
console.log(obj.type); //如果触发的是全选,则为:all,如果触发的是单选,则为:one
});
//编辑
table.on('edit(test)', function (obj) { //注:edit是固定事件名,test是table原始容器的属性 lay-filter="对应的值"
alert("1122" + obj.value);
console.log(obj.value); //得到修改后的值
console.log(obj.field); //当前编辑的字段名
console.log(obj.data); //所在行的所有相关数据
});
//监听单元格事件
table.on('tool(test)', function (obj) {
var data = obj.data;
if (obj.event === 'setSign') {
alert("eeeeeee:" );
//同步更新表格和缓存对应的值
obj.update({
state2: '7777777'
});
/*
layer.prompt({
formType: 2
, title: '修改 ID 为 [' + data.id + '] 的用户签名'
, value: data.sign
}, function (value, index) {
layer.close(index);
//这里一般是发送修改的Ajax请求
//同步更新表格和缓存对应的值
obj.update({
sign: value
});
});
*/
}
});
//监听工具条
/*
table.on('tool(test)', function (obj) { //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
var data = obj.data; //获得当前行数据
var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
var tr = obj.tr; //获得当前行 tr 的 DOM 对象(如果有的话)
if (layEvent === 'detail') { //查看
//do somehing
} else if (layEvent === 'del') { //删除
layer.confirm('真的删除行么', function (index) {
obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
layer.close(index);
//向服务端发送删除指令
});
} else if (layEvent === 'edit') { //编辑
//do something
//同步更新缓存对应的值
obj.update({
state2: '123'
, empname: 'xxx'
});
} else if (layEvent === 'LAYTABLE_TIPS') {
layer.alert('Hi,头部工具栏扩展的右侧图标。');
}
});
*/
});
</script>
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
<!-- 这里同样支持 laytpl 语法,如: -->
{{# if(d.auth > 2){ }}
<a class="layui-btn layui-btn-xs" lay-event="check">审核</a>
{{# } }}
</script>
一、简介
Lambda表达式来源于数学家Alonzo Church等人在1920~1930期间发明的Lambad积分。Lambda积分是用于表示函数的一套系统,它使用希腊字母Lambda( λ )来表示无名函数。
C# 3.0引入了Lambda表达式,它是一种简化的匿名函数,可用于创建委托或表达式目录树。你也可以将 Lambda 表达式作为参数进行传递,或者将它作用于函数调用值调用后返回的一个函数来使用。
二、基础
它的语法形式是: 输入参数 => 表达式或语句块 即运算符的左边是输入参数(如果有),右边是表达式或语句块。 ( “ => ” 读作 “ goes to ” )
2.1 表达式Lambda
表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。 表达式 Lambda 会返回表达式的结果,并采用以下基本形式:
(input parameters) => expression
delegate int myDel(int x,int y); //声明委托
class Program
{
static void Main(string[] args)
{
myDel del = (x,y) => x+y; //返回x+y的结果
Console.WriteLine("values {0}",del(5,8)); //输出13 Console.ReadKey(); } }
有关Lambda表达式的参数列表要点如下:
♥ Lambda表达式参数列表中的参数必须在参数数量、类型和位置上与委托相匹配
♥ 表达式参数列表中的参数不一定需要包含类型(隐式类型),除非委托有ref或out参数----此时必须注明类型(显式类型)
♥ 如果只有一个参数,并且是隐式类型的,周围的圆括号可以被省略,否则必须有括号
♥ 如果没有参数,必须使用一组空的圆括号
2.2 语句Lambda
当lambda表达式中,有多个语句时,写成如下形式:
(input parameters) => { statement; }
delegate int myDel(string str);
class Program
{
static void Main(string[] args)
{
myDel del = (str) =>
{
Console.WriteLine("hello {0}",str);
return 123;
};
Console.WriteLine("values {0}",del("world"));
Console.ReadKey();
}
}
在C#的语法中有一种比较特殊的写法,叫做Lambda表达式,这种表达式的写法在于你查询数据的时候直接是使用以下箭头的形式来表示查询语句的:=>。例如,我们要查找学生的List<Student>集合中班级编号为1001的所有学生数据,我们即可用Studentlist.Where(t=>t.ClassCode=‘1001’)语句来直接完成,无需再写繁琐的foreach语句或者for循环。Lambda表达式的运算符即为=>。
一、Lambda表达式定义
Lambda表达式实际上是一种匿名函数,在Lambda表达式中可以包含语句以及运算等操作。并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。使用Lambda表达式可大大减少代码量,使得代码更加的优美、简洁,更有可观性。
二、Lambda表达式的表现形式
表达式形式:(Input Param)=>Expression。在表达式左侧的表示输入参数,右侧的为相应的运算语句或者判断语句等,可包含函数调用等复杂方式。运算符=>读作为goes to,例如下面这个表达t=>t.ClassCode='1001',多做goes to ClassCode equal 1001。
在上述的表达式中,仅仅只有当参数只有一个的时候,括号是可选择的,例如下面这种含有两个参数时候的情况应该是这样子的写法
当表达式中的多个参数编译器无法自动判断类型的时候,则需要显式指定类型。
1 | ( int firstIndex, string str) => str.IndexOf( 'Hello' ) > firstIndex
|
(1)查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储
1 | var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’);
|
(2)查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储,并按照学生的出生日期从小到大排列。
1 | var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’).OrderBy(t=>t.BirthDay);
|
在此说一下,OrderBy是从小到大排序,需要从大到小排列则用OrderByDescending。
(3)查询班级编号为1001的班级下面的姓氏为【李】的同学的所有集合,并按照学生的出生日期从小到大排列。
1 | var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’&&t.StudentName.StartWith(“李”)).OrderBy(t=>t.BirthDay);
|